====== структуры ======
===== Объявление и определение структуры =====
Объявление структуры:\\
''struct имя_структуры;''
Объявленна, но неопределенная, структура считаеться __неполным типом__ и сделать с ней что либо нельзя тк ее размер без определения неизвестен. Объявить структуру можно несколько раз, а определить лишь раз.
===== Использование структуры =====
// определение структуры person
struct person {
char * name;
int age;
};
int main(void) {
// определение переменной, которая представляет структуру person
struct person tom;
}
определение структуры и ее переменной сразу
struct person{
int age;
char * name;
} tom;
при таком обявлении переменной __можно не указывать имя__ структуры.
определение структуры через typedef (тн псевдоним структуры):
#include
typedef struct {
int age;
char* name;
} person;
int main(void) {
person tom = {23, "Tom"};
printf("Name:%s \t Age: %d\n", tom.name, tom.age);
return 0;
}
==== Инициализация структуры ====
**По позиции**: значения передаются элементам структуры в том порядке, в котором они следуют в структуре:
struct person tom = {23, "Tom"};
Так как в структуре person первым определено свойство age, которое представляет тип int - число, то в фигурных скобках вначале идет число, которое передается элементу age. Вторым идет элемент name, который представляет указатель на тип char или строку, соответственно вторым идет строка. И так далее для всех элементов структуры по порядку.
**По имени**: значения передаются элементам структуры по имени, независимо от порядка:
struct person tom = {.name="Tom", .age=23};
В этом случае перед именем элемента указывается точка, например, .name.
иницииализация переменной при объявлении структуры:
struct person {
int age;
char * name;
} tom = {38, "Tom"};
==== Обращение к элементам структуры ====
''имя_переменной_структуры.имя_элемента''
#include
struct person {
int age;
char *name;
};
int main(void) {
struct person tom = {23, "Tom"};
printf("Age: %d \t Name: %s", tom.age, tom.name);
return 0;
}
===== Составные литералы =====
Составные литералы (compound literals) позволяют сократить код и использовать литералы, которые представляют структуру, без определения переменной структуры
#include
typedef struct {
int x;
int y;
} Point;
void print_point(Point p) {
printf("(X:%d; Y:%d)\n", p.x, p.y);
}
Point create_point(int x, int y) {
return (Point) {x, y}; // возвращаем строковой литерал
}
int main() {
Point p = create_point(170, 150);
print_point(p);
return 0;
}