Перейти к содержимому

Как создать массив структур в си

  • автор:

Как создать массив структур в си

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

struct person people[10];

В данном случае определен массив структур person из 10 элементов.

Используем массив структур в программе:

#include struct person < int age; char name[20]; >; int main(void) < struct person people[] = < , , , >; int n = sizeof(people)/sizeof(people[0]); for(int i=0; i return 0; >

В массиве people определено 4 объекта person. При инициализации данные каждой отдельной структуры заключаются во вложенные фигурные скобки:

Обращение к элементам массива структур происходит по индексу people[0] . А чтобы обратиться к элементу структуры из массива, после индекса указывается имя элемента структуры: people[i].name

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

Name: Tom Age: 23 Name: Bob Age: 32 Name: Alice Age: 26 Name: Sam Age: 41

И также как с массивами других типов с массивами структур можно использовать указатели:

#include struct person < int age; char name[20]; >; int main(void) < struct person people[] = < , , , >; int n = sizeof(people)/sizeof(people[0]); for(struct person *p=people; p < people+n; p++) < printf("Name:%s \t Age: %d \n", p->name, p->age); > return 0; >

Здесь в массиве people те же 4 элемента person. Для их просмотра создан указатель *p, который устанавливается на начало массива people. И в цикле получаем элементы структур через этот указатель. После завершения каждой итерации указатель увеличивается на единицу, то есть перемещается в памяти на количество байт, которые занимает одна структура. И эти действия продолжаются пока указатель не дойдет до конца массива, который можно получить через выражение people+n.

Массивы и структуры в структурах

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

Рассмотрим следующую структуру:

struct x int а [10] [10]; /* массив целых 10 х 10 */
float b;
> у;

Для обращения к числу с индексами 3, 7 массива а структуры у следует написать:

Когда структура является членом другой структуры, то она называется вложенной структурой.

Например, ниже структура addr вложена в emp:

struct emp struct addr address;
float wage;
> worker;

Здесь структура emp имеет два члена. Первый — это структура типа addr, содержащая адреса служащих. Другой — это wage, содержащий заработную плату служащих. Следующий фрагмент кода присваивает 35000$ элементу wage структуры worker и 98765 полю zip структуры address:

worker.wage = 35000.00;
worker.address.zip = 98765;

В данном примере обращение к членам каждой структуры происходит снаружи вовнутрь (слева направо).

Массивы структур

Возможно, наиболее часто структуры используются в виде массивов структур. Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа. Например, для объявления 100-элементного массива структур типа addr следует написать:

struct addr addr_info[100];

В результате получаем набор из 100 переменных, устроенных, как объявлено в типе структуры addr.

Для доступа к отдельным структурам массива adar_info следует проиндексировать имя массива. Например, для вывода содержимого поля zip третьей структуры, следует написать:

Как и массивы переменных, массивы структур индексируются с нуля.

Создать массив структур со студентами на Си

Что вы хотели написать этой строкой? struct addStudent(char name[], unsigned int age, unsigned int course, unsigned int); ? Если это функция, то что она возвращает?

24 ноя 2019 в 8:50

Я хотел написать функцию, которая принимает имя, возраст и курс, и возвращает структуру, которая потом сохранится в массив.

24 ноя 2019 в 8:52
Какую структуру? Структуру вообще?
24 ноя 2019 в 8:53

Эту функцию я взял нашел на одном сайте student addStudent (char ch[], unsigned int cr, unsigned int ag) < student res_st; strcpy(res_st.nm, ch); res_st.course = cr; res_st.age = ag; student_counter++; return res_st; >

24 ноя 2019 в 8:55
А теперь сравните с тем, что написали вы.
24 ноя 2019 в 8:58

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

вам стоило бы изучить указатели и выделение памяти

вот рабочий пример:

#include #include #include #include struct student *addStudent(char *name, unsigned int age, unsigned int course); struct student < char name[50]; unsigned int age; unsigned int course; >; unsigned int student_counter = 0; int main(void) < setlocale(LC_ALL, "Rus"); struct student *st[20]; st[0] = addStudent("Руслан", 18, 1); student_counter += 1; for (int i = 0; i < student_counter; i++) < printf("%s \t %d курс \t %d лет \n", st[i]->name, st[i]->course, st[i]->age); > return 0; > struct student *addStudent(char *name, unsigned int age, unsigned int course) < struct student *res_st = malloc(sizeof(struct student)); strcpy(res_st->name, name); res_st->age = age; res_st->course = course; return res_st; > 

а функцию addStudent у вас не получается создать потому что:

  • в аргументах фунции после unsigned нужно написать тип данных int
  • вы не возвращаете созданную вами структуру, она создается внутри функции и после ее завершения она пропадает
  • в аргументах дублируется обьявление age

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *