Инициализация массива структур при помощи указателя р
Инициализация структур без указателя
Пример
Указатели и структуры
JL
J L
JL
JL
1 1
О о
I _ Is. I _ К
0 0 0 0
еюаааа
[31 [21
J
Рис. 1.11. Содержимое участка памяти, отведенного под структуру struct field type
На экран будет выведено следующее число:
1-211 + 1-2 9+ 1-2 6+ 1-2 4+ 1-21 + 1-2 ° = 2643.
Выбор элементов структуры или объединения.Выражение выбора элемента позволяет получить доступ к элементу структуры или объединения. Выражение имеет значение и тип выбранного элемента.
Возможны три способа доступа к полям [4]:
1) <выражение>.<идентификатор>, где <выражение> — значение типа struct или union; <идентификатор> — поле структуры или объединения;
2) <выражение> -> <идентификатор>, где <выражение> — указатель на структуру или объединение; <идентификатор> — поле структуры или объединения;
3) (<*выражение>).<идентификатор>, где <выражение> — указатель на структуру или объединение; <идентификатор> — поле структуры или объединения.
Работа со структурами с помощью указателей.Доступ к элементам структуры или объединения можно осуществить с помощью указателей. Для этого необходимо инициализировать указатель адресом структуры или объединения [14].
/* | Объявление структуры | типа book.*/ | |||
St { | ruct book | ||||
char title [15]; | |||||
char author [15]; | |||||
}; | float value ; | ||||
/* | Объявление массива ст | руктур типа book,* | / | ||
/* | состоящего из 100 элементов. */ | ||||
/* | Имя массива libry. */ | ||||
St | ruct book libry [100]; | ||||
/* | Объявление указателя | на структуру типа | book.*/ | ||
St | ruct book *p; | ||||
/* | Инициализация указателя р адресом*/ | ||||
/* | 0-го элемента массива | структур типа | book | */ | |
р= | &libry[0]; |
Для организации работы с массивом можно использовать указатель р или имя массива:
1) (*р).value, что равнозначно записи libry[0].value; 2)р-> value, что равнозначно записи libry[0].value.
gets ( libry[i] .title ); | /* | Ввод | названия книги.*/ |
gets ( libry[i].author); | /* | Ввод | имени автора.*/ |
scanf("%f", &libry[i].value); | /* | Ввод | цены книги.*/ |
libry[i].value=123; | /* | Ввод | цены книги.*/ |
gets((*p).title); | /* | Ввод названия книги.*/ |
gets ( ( *р) .author); | /* | Ввод имени автора.*/ |
(*р).value=123; | /* | Ввод цены книги.*/ |
gets(p —> title); | /* | Ввод названия книги.*/ |
gets( p —> author); | /* | Ввод имени автора.*/ |
p —> value=150; | /* | Ввод цены книги.*/ |
Указатель р содержит адрес начала массива— адрес нулевого элемента массива структур типа book. Используя р, можно осуществить доступ к каждому полю структуры типа book. Чтобы осуществить доступ к другим структурам, необходимо изменить адрес, хранящийся в р. Сдвиг указателя на / элементов массива осуществляется следующим образом:
p=p + i;.
Графическое представление массива структур в памяти ЭВМ показано на рис. 1.12.
Динамическое распределение памяти под массив структур.Динамически распределять память под массив структур необходимо в том случае, когда заранее не известен размер массива.
float value |
chartitle[15] |
Адрес начала массива
Название Имя Цена книги автора книги
Z |
/------------------
char author[15]
" libry[0]
p + 1
char title[15]
char author[15]
T
float value
" libry [1]
P + 2
chartitle[15]
char author[15]
Z
float value
■
bry[2]
p + i
chartitle[15]
z
char auth or[15]
Z
float value
libry [i]
p + 99/
chartitle[15]
Последний элемент массива структур
I
char atithor[15]
Z
float value
7\
libry [99]
Рис. 1.12. Массив структур
Пример
#include <stdio.h> #include <alloc.h> struct book
{
char title [30] ; char author [30]; float value;
}; main ( )
{
struct book *p ; int n;
/*n - число структур book*/
printf("\пВведите n:");
scanf("%u", &n); | |
p=(struct book *)malloc(n*sizeof( | struct book)); |
/^Переменная р содержит адрес */ | |
/^нулевой структуры типа book.*/ |