Структура (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
Для получения доступа к членам структуры используются два типа операторов:
- Оператор членства (member operator) (
.) - Указатель структуры (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;
}
Собираем и выполняем:
[simterm]
$ 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
[/simterm]
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;
}
Собираем, проверяем:
[simterm]
$ 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
[/simterm]
В целом этого достаточно, что бы уловить основную идею, лежащую в структурах.
To be continued.
Оригинал и продолжение — тут>>>.




