Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
114-124.docx
Скачиваний:
4
Добавлен:
11.09.2019
Размер:
121.04 Кб
Скачать

Передача информации о структурах функциям. Использование массива.

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

/* передача массива структур в функцию */

#include<stdio.h>

struct funds {

char *bank;

float bankfund;

char *save;

float savefund; } jones[2] ={

{

"Senior tomatoes Bank",

1023.43,

"Savings and lendings of Snoopy",

4239.87

},

{

"Honest Jack's Bank",

976.57,

"Accumulation by prior plan",

1760.13

}

};

float sum(struct funds *);

void main()

{

float total;

total=sum(jones);

printf ("Jonsons have only %.2f dollars.\n" , total);

}

float sum (struct funds *money)

{

float total;

int i;

for( i = 0, total = 0; i < 2; i++ , money++)

total+= money->bankfund + money->savefund;

return(total);

}

Программа выдает

Джонсы имеют всего 8000.00 долл.

(Что за круглая сумма! Можно подумать, что эти цифры взяты с потолка.)

Имя массива Jones является указателем на массив. В частности, оно ссылается на первый элемент массива, который является структурой jones[0]. Таким образом, в начале указатель money задается через

money = &jones[0];

Затем использование операции — > позволяет нам добавить два вклада для первого Джонса. Это действительно очень похоже на последний пример. Далее, цикл for увеличивает указатель money на 1. Теперь он ссылается на следующую структуру, jones[1], и остаток вкладов может быть добавлен к total.

Вот два основных замечания:

  1. Имя массива можно использовать для передачи в функцию указателя на первую структуру в массиве.

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

sum(&jones[0])

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

        1. Структуры внутри структур.

Допускаются объявления вложенных структур. Это означает, что структура может содержать один или несколько элементов структурного типа. Предположим, что следующая структура может быть включена в другую:

struct strepair { // ремонт

int ioilchange; // замененное масло

int iplugs; // втулки

int lairfilter; // воздушный фильтр

int ibarnacle_cleaning; // ветошь для чистки

};

Структуру strepair можно включить в главную структуру следующим образом:

struct stboat {

char sztype [iSTRING15 + iNULL_CHAR];

char szmodel[iSTRING15 + iNULL_CHAR];

char sztitle[iSTRING20 + iNULL_CHAR];

char szcomment[80];

struct strepair strepair_record;

int iyear;

long int lmotor_hours;

float fretail;

float fwholesale;

} astNineveh[iMAX_BOATS] ;

Для доступа к некоторому элементу структуры strepair_record можно использовать такой оператор:

printf("%d\n",astNineveh[0].strepair_record.ibarnacle_cleaning);

  1. Структуры и битовые поля. Структуры. Их дальнейшее использование.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]