Структура (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.
Оригинал и продолжение — тут>>>.