1) Структуры объединяют несколько типов данных. Например нам нужна структура для хранения координат.
struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
};
struct point p1 = {}; // Инициализация нулями
struct point p2 = {10, 20}; // Инициализация значениями
struct point p3 = {.y = 4, .x = 6}; // Именнованная инициализация, порядок элементов любой
struct point p4; // Объявление
p4.x = 5; // Инициализация значением
p4.y = p3.x; // Инициализация другой переменной (p4.x = 6)
2) Можно сразу объявить экземпляр структуры
struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}p1; // Сразу заводим структуру p1 и p2
3) Можно сразу объявить несколько экземпляров структур
struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}p1, p2, p3; // Сразу заводим структуру p1, p2, p3
4) Объявление структуры можно совмещать с инициализацией
struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}p1 = {}, p2 = {3, 2}, p3; // Сразу создаем три экземпляра структуры point - p1 (инициализируем нулями),p2 и p3
5) Структуру можно возвращать и передавать в функцию. Структура передается по значению (в функции копия структуры - исходная не меняется)
struct point func(struct point p){ // Функция принимает и возвращает структуру
printf("p.x = %d, p.y = %d \n", p.x, p.y);
p.x = 40; // Изменяем значения структуры
p.y = 60;
return p; // Возвращаем структуру
}
6) Для инициализации полей структуры нулевыми значениями, можно использовать следующие два варианта объявления с инициализацией.
struct point p = {}; // Инициализация полей структуры p нулями
struct point p = {0}; // Инициализация полей структуры p нулями
7) Пример программы с использованием структур.
#include <stdio.h> // printf()
struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}p1 = {}, p2 = {3, 2}, p3; // Сразу создаем три экземпляра структуры point - p1 (инициализируем нулями),p2 и p3
struct point func(struct point p){ // Функция принимает и возвращает структуру
printf("p.x = %d, p.y = %d \n", p.x, p.y);
p.x = 40; // Изменяем значения структуры
p.y = 60;
return p; // Возвращаем структуру
}
int main(){
p3.x = 7; // Инициализация
p3.y = 9; // Инициализация
struct point p4 = {}; // Объявление и инициализация элемента структуры нулями
struct point p5 = {5, 4}; // Объявление и инициализация элемента структуры значениями
p5.x = 10; // Изменение поля x структуры p5
p5.y = 20; // Инициализация поля y структуры p5
struct point p6; // Объявление структуры
p6.x = -2; // Инициализация поля x структуры p6
p6.y = 3; // Инициализация поля y структуры p6
printf("p1.x = %d, p1.y = %d \n", p1.y, p1.x); // p1.x = 0, p1.y = 0
printf("p2.x = %d, p2.x = %d \n", p2.x, p2.y); // p2.x = 3, p2.x = 2
printf("p3.x = %d, p3.x = %d \n", p3.x, p3.y); // p3.x = 7, p3.x = 9
printf("p4.x = %d, p4.x = %d \n", p4.x, p4.y); // p4.x = 0, p4.x = 0
printf("p5.x = %d, p5.x = %d \n", p5.x, p5.y); // p5.x = 10, p5.x = 20
p5 = func(p6); // Передача и возврат структуры из функции p.x = -2, p.y = 3
printf("p6.x = %d, p6.x = %d \n", p6.x, p6.y); // p6.x = -2, p6.x = 3 Структура передается по значению и ее элементы не меняются
printf("p5.x = %d, p5.x = %d \n", p5.x, p5.y); // p5.x = 40, p5.x = 60 Структура возвращенная функцией
}
8) Использование ключевого слова typedef перед объявление структуры позволяет использовать назначенный псевдоним для создания и ссылок на структуры без ключевого слова struct.
typedef struct{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}point;
point p1 = {}; // Инициализация нулями
point p2 = {10, 20}; // Инициализация значениями
point p3 = {.y = 4, .x = 6}; // Именованная инициализация, порядок элементов любой
point p4; // Объявление
p4.x = 5; // Инициализация значением
p4.y = p3.x; // Инициализация другой переменной (p4.x = 6)
9) Пример с передачей в функцию структуры с typedef и без struct
#include <stdio.h> // prinf()
typedef struct{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}point;
void some_func(point pt){ // Функция принимающая структуру как аргумент
printf("x = %d, y = %d\n", pt.x, pt.y);
}
int main(){
point center = {5, 5}; // Объявление и инициализация структуры
some_func(center); // x = 5, y = 5 Передача структуры в функцию
some_func((point) {3, 5}); // x = 3, y = 5 Вызов функции со структурой
}
10) Другой вариант использования typedef работает так же как если бы не было указано typedef перед struct
typedef struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
};
struct point p1 = {}; // Инициализация нулями
struct point p2 = {10, 20}; // Инициализация значениями
struct point p3 = {.y = 4, .x = 6}; // Именованная инициализация, порядок элементов любой
struct point p4; // Объявление
p4.x = 5; // Инициализация значением
p4.y = p3.x; // Инициализация другой переменной (p4.x = 6)
11) Возможен смешанный вариант использования typedef позволяющий работать как со структурой без typedef
typedef struct point{ // Объявляем структуру point
int x; // Координата x
int y; // Координата y
}point;
point p1 = {}; // Не используем struct
struct point p2 = {10, 20}; // Используем struct
point p3 = {.y = 4, .x = 6}; // Не используем struct
struct point p4; // Используем struct
p4.x = 5; // Инициализация значением
p4.y = p3.x; // Инициализация другой переменной (p4.x = 6)
Пример программы с возвратом и передачей указателя на структуру в функцию (а также создание структуры в функции) приведено в Указатели.