Структуры в языке Си

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 Структура возвращенная функцией
}        

Использование typedef со структурами в языке Си

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)        

Пример программы с возвратом и передачей указателя на структуру в функцию (а также создание структуры в функции) приведено в Указатели.

2023-03-12



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

auto ключевое слово языка Си.
break оператор языка Си. Завершает выполнение операторов do, while, for, switch.
case ключевое слово языка Си. Используется в операторе switch для задания одной из веток ветвления.
Время выполнения программы на языке Си. Функция clock().
const ключевое слово языка Си. Сделать переменную или указатель неизменяемым.
continue оператор языка Си. Пропускает текущую итерацию цикла.
default ключевое слово языка Си.
do while ключевые слова Си.
else ключевое слово языка Си.
Функции работы с файлами в языке Си
for оператор языка Си.
if оператор языка Си.
Ключевые слова языка Си
Указатели в языке Си
register Си, размещение переменных в регистрах процессора
Зарезервированные имена языка Си
signed ключевое слово языка Си.
Структуры в языке Си. Примеры различного использования.
switch оператор языка Си.
typedef ключевое слово языка Си. Задание псевдонимов для типов данных.
Типы данных языка Си
unsigned ключевое слово Си.
void ключевое слово языка Си.
volatile ключевое слово языка Си.
while оператор цикла языка Си.