C: структуры

Автор: | 08/21/2017
 

Структура (structure) в C — коллекция переменных различного типа, доступ к которым возможен по одному и тому же имени.

Например, вы хотите сохранить информацию о человеке — его имя, гражданство и зарплату. Вы можете создать переменные name, citizenship, salary и хранить информацию в них.

Но что, если вам потребуется хранить информацию о нескольких людях? Можно создать переменные типа name1, citizenship1, salary1 и т.д., но вы представляете — каким неудобным будет такой подход?

Более простым решением было бы хранить всю связанную информацию под одним именем, скажем Person, и использовать его для каждого человека, информацию  котором вы хотите хранить.

Такая коллекция связанной информации под одним именем и будет являться структурой.

Structure Definition in C

Для создания структуры — используется ключевое слово struct.

Синтаксис структуры

Общий синтаксис выглядит следующим образом:

struct structure_name  {
    data_type member1;
    data_type member2;
    .
    .
    data_type memeber;
};

А создать структуру Person можно так:

struct person {
    char name[50];
    int citizenship;
    float salary;
};

В результате — мы получаем производный тип данных (derived data type) struct person.

Structure variable declaration

После того как структура была объявлена — она создаёт пользовательский тип данных, но при этом в памяти место не выделяется.

Выполнить объявление переменной структуры person мы можем следующим образом:

#include <stdio.h>

struct person {
    char name[50];
    int citizenship;
    float salary;
};

int main() {
    struct person person1, person2, person3[20];
    return 0;
}

Либо так:

...
struct person {
    char name[50];
    int citizenship;
    float salary;
} person1, person2, person3[20];
...

В обоих случаях создаются две переменные — person1, person2 и массив person3 с 20-ю элементами типа struct person.

Accessing members of a structure

Для получения доступа к членам структуры используются два типа операторов:

  1. Оператор членства (member operator) (.)
  2. Указатель структуры (structure pointer operator) (->)

С помощью оператора членства любой член структуры может быть получен так:

structure_variable_name.member_name

Например, если вы хотите узнать зарплату человека person2 — вы можете получить её из элемента person2.salary.

Про применение указателей — в продолжении.

Пример структуры

Теперь — попробуем создать структуру person, наполнить её данными и выполнить операцию сложения:

#include <stdio.h>

struct person {
    char name[50];
    char citizenship[2];
    float salary;
};

int main() {
    struct person person1, person2, totalSalary;

    printf("\nEnter first person name: ");
    scanf("%s", &person1.name);

    printf("\nEnter first person citizenship: ");
    scanf("%s", &person1.citizenship);

    printf("\nEnter first person salary: ");
    scanf("%f", &person1.salary);

    printf("\nEnter second person name: ");
    scanf("%s", &person2.name);

    printf("\nEnter second person citizenship: ");
    scanf("%s", &person2.citizenship);

    printf("\nEnter second person salary: ");
    scanf("%f", &person2.salary);

    totalSalary.salary = person1.salary + person2.salary;

    if (totalSalary.salary > 0) {
        printf("\n%s and %s salaries are %f\n", person1.name, person2.name, totalSalary.salary);
    }

    return 0;
}

Собираем и выполняем:

gcc struct.c -o struct
./struct
Enter first person name: name1
Enter first person citizenship: ua
Enter first person salary: 100.0
Enter second person name: name2
Enter second person citizenship: uk
Enter second person salary: 1000.0
name1 and name2 salaries are 1100.000000

typedef и структуры

Использование формы struct structure_name variable_name; для объявления структуры не слишком интуитивно понятно, потому некоторые разработчики предпочитают применять ключевое слово typedef для именования структур, например:

#include <stdio.h>

typedef struct complex {
  int imag;
  float real;
} comp;

int main() {
  comp comp1, comp2;
}

Тут typedef используется для создания типа comp, который является типом структуры complex, после чего создаются две переменных структуры — comp1 и comp2, которые являются типом comp.

Вложенные структуры

Структуры могут содержать вложенные структуры, например:

struct complex {
 int imag_value;
 float real_value;
};

struct number {
   struct complex comp;
   int real;
} num1, num2;

И пример использования вложенной структуры и получения данных:

#include <stdio.h>

struct person {
    char name[20];
    int salary;
};

struct expertize {
    struct person info;
    int years;
} person1, person2, totalYears;

int main () {

    printf("\nEnter first person name: ");
    scanf("%s", &person1.info.name);

    printf("Enter first person salary: ");
    scanf("%d", &person1.info.salary);

    printf("Enter first person experience: ");
    scanf("%d", &person1.years);

    printf("\nEnter second person name: ");
    scanf("%s", &person2.info.name);

    printf("Enter second person salary: ");
    scanf("%d", &person2.info.salary);

    printf("Enter second person experience: ");
    scanf("%d", &person2.years);

    totalYears.years = person1.years + person2.years;

    if (totalYears.years > 0) {
        printf("\n%s and %s works together %d years\n", person1.info.name, person2.info.name, totalYears.years);
    }

    return 0;
}

Собираем, проверяем:

gcc struct_nested.c -o struct_nested
./struct_nested
Enter first person name: name1
Enter first person salary: 100
Enter first person experience: 1
Enter second person name: name2
Enter second person salary: 1000
Enter second person experience: 10
name1 and name2 works together 11 years

В целом этого достаточно, что бы уловить основную идею, лежащую в структурах.

To be continued.

Оригинал и продолжение — тут>>>.