Как создать массив структур в си
Из структур можно создавать массивы также, как массивы других типов. И все форматы определения массива структур будут аналогичны определению массивов других типов:
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