Инициализация массива структур при помощи указателя р

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

Пример

Указатели и структуры

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.*/