MyTetra Share
Делитесь знаниями!
Структуры в языке Си. Определения структур в сравнении с языком C++
Время создания: 30.03.2023 15:21
Текстовые метки: язык, Си, C, C++, структура, struct
Раздел: Компьютер - Программирование - Язык C (Си)
Запись: xintrea/mytetra_syncro/master/base/1680178880mr2lqgl5hd/text.html на raw.github.com

Структура в языке программирования Си представляет собой составной тип данных, который состоит из других компонентов. При этом в отличие от массива эти компоненты могут представлять различные типы данных.



Определение структуры


Для определения структуры применяется ключевое слово struct, а сам формат определения выглядит следующим образом:



struct имя_структуры

{

компоненты_структуры

};



Имя_структуры представляет произвольный идентификатор, к которому применяются те же правила, что и при наименовании переменных.


После имени структуры в фигурных скобках помещаются компоненты структуры - объекты, которые составляют структуру.


Следует отметить, что в отличие от функции при определении структуры после закрывающей фигурной скобки идет точка с запятой.


Например, определим простейшую структуру:



struct person

{

int age;

char * name;

};



Здесь определена структура person, которая имеет два элемента: age (представляет тип int) и name (представляет указатель на тип char).


Все элементы структуры объявляются как обычные переменные. Но в отличие от переменных при определении элементов структуры для них не выделяется память, и их нельзя инициализировать. По сути мы просто определяем новый тип данных.

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


После определения структуры мы можем ее использовать. Для начала мы можем определить объект структуры - по сути обычную переменную, которая будет представлять выше созданный тип:



// определение структуры person

struct person

{

int age;

char * name;

};

int main(void)

{

// Определение переменной, которая представляет структуру person

struct person tom;

}



Здесь определена переменная tom, которая представляет структуру person. И при каждом определении переменной типа структуры ей будет выделяться память, необходимая для хранения ее элементов.



Примечание: в языке C++, в отличие от языка C, при определении переменной с типом объявленной пользователем структуры или класса, ключевое слово struct писать не обязательно (и обычно не пишется).


// Определение переменной с типом person в языке C++

person tom;


То же самое правило используется и при написании определения с инициализацией (см. далее) - ключевое слово struct писать не имеет смысла.



Инициализация структуры


При определении переменной структуры ее можно сразу инициализировать, присвоив какое-нибудь значение. Инициализация структур аналогична инициализации массивов: в фигурных скобках передаются значения для элементов структуры. Есть два способа инициализации структуры.


По позиции: значения передаются элементам структуры в том порядке, в котором они следуют в структуре:


struct person tom = {23, "Tom"};


Так как в структуре person первым определено свойство age, которое представляет тип int - число, то в фигурных скобках вначале идет число, которое передается элементу age. Вторым идет элемент name, который представляет указатель на тип char или строку, соответственно вторым идет строка. И так далее для всех элементов структуры по порядку.


По имени: значения передаются элементам структуры по имени, независимо от порядка:


struct person tom = {.name="Tom", .age=23};


В этом случае перед именем элемента указывается точка, например, .name.



Обращение к элементам структуры


Также после создания переменной структуры можно обращаться к ее элементам - получать их значения или, наоборот, присваивать им новые значения. Для обращения к элементам структуры используется операция "точка":



имя_переменной_структуры.имя_элемента



Теперь объединим все вместе в рамках программы:



#include <stdio.h>

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;

}



Консольный вывод программы:



Age: 23 Name: Tom



Можно инициализировать элементы структуры по отдельности:



#include <stdio.h>

struct person

{

int age;

char * name;

};

int main(void)

{

struct person tom;


tom.name ="Tom";

tom.age = 22;


printf("Name:%s \t Age: %d", tom.name, tom.age);


return 0;

}



Объединение определение структуры и ее переменных


Мы можем одновременно совмещать определение типа структуры и ее переменных:



#include <stdio.h>

struct person

{

int age;

char * name;

} tom; // определение структуры и ее переменной

int main(void)

{

tom = {38, "Tom"};

printf("Name:%s \t Age: %d", tom.name, tom.age);

return 0;

}



После определения структуры, но до точки с запятой мы можем указать переменные этой структуры. А затем присвоить их элементам значения.


Можно тут же инициализировать структуру:



#include <stdio.h>

struct person

{

int age;

char * name;

} tom = {38, "Tom"};

int main(void)

{

printf("Name:%s \t Age: %d", tom.name, tom.age);

return 0;

}



Можно определить сразу несколько переменных:



struct person

{

int age;

char * name;

} tom, bob, alice;



При подобном определении мы можем даже не указывать имя структуры:



struct

{

int age;

char * name;

} tom;



В этом случае компилятор все равно будет знать, что переменная tom представляет структуры с двумя элементами name и age. И соответственно мы также с этими переменными сможем работать. Другое дело, что мы не сможем задать новые переменные этой структуры в других местах программы.



typedef


Еще один способ определения структуры представляет ключевое слово typedef:



#include <stdio.h>

typedef struct

{

int age;

char * name;

} person;

int main(void)

{

person tom = {23, "Tom"};

printf("Name:%s \t Age: %d", tom.name, tom.age);

return 0;

}



В конце определения структуры после закрывающей фигурной скобки идет ее обозначение - в данном случае person. В дальнейшем мы можем использовать это обозначение для создания переменной структуры. При этом в отличие от примеров выше здесь при определении переменной не надо использовать слово struct.



Директива define


Еще один способ определить структуру представляет применение препроцессорной директивы #define:



#include <stdio.h>

#define PERSON struct {int age; char name[20];}

int main(void)

{

PERSON tom = {23, "Tom"};

printf("Name:%s \t Age: %d", tom.name, tom.age);

return 0;

}



В данном случае директива define определяет константу PERSON, вместо которой при обработке исходного кода препроцессором будет вставляться код структуры struct {int age; char name[20];}

Копирование структур


Одну структуру можно присвавивать другой структуре того же типа. При копировании элементы структуры получают копии значений:



#include <stdio.h>

struct person

{

int age;

char * name;

};

int main(void)

{

struct person tom = {38, "Tom"};


// копируем значения из структуры tom в структуру bob

struct person bob = tom;

bob.name = "Bob";


printf("Name: %s \t Age: %d \n", bob.name, bob.age);

printf("Name: %s \t Age: %d \n", tom.name, tom.age);


return 0;

}



Здесь в переменную bob копируются данные из структуры tom. Далее мы для структуры bob меняется значение поля name. В итоге мы получим следующий консольный вывод:



Name: Bob Age: 38 Name: Tom Age: 38



Ввод с консоли данных для структуры


С элементами структуры можно производить все те же операции, что и с переменными тех же типов. Например, добавим ввод с консоли:



#include <stdio.h>

struct person

{

int age;

char name[20];

};

int main(void)

{

struct person tom = {23, "Tom"};


printf("Enter name: ");

scanf("%s", tom.name);


printf("Enter age: ");

scanf("%d", &tom.age);


printf("Name:%s \t Age: %d", tom.name, tom.age);


return 0;

}



Консольный вывод программы:


Enter name: Eugene

Enter age: 33

Name: Eugene Age: 33



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования