Структуры как аргументы функций
Зачастую в тело функции необходимо передать информацию, структурированную по определенному принципу. При этом в качестве параметра в прототипе функции указывается пользовательский тип данных, сформированный при объявлении структуры. Так, если была объявлена структура
struct ALLNUMB
{
int nVar; long 1Var; short shVar; unsigned int uiVar;
};
прототип функции будет, например, иметь вид: void Func(ALLNUMB);
При этом происходит передача в тело функции параметра типа структуры по значению. Таким образом, оригинал структурированного объекта модификации не подлежит. Функция может также возвращать объект типа структуры:
ALLNUMB Func2(ALLNUMB);
В этом случае модифицированные данные при выходе из функции не потеряются, а будут переданы в точку вызова функции.
Рассмотрим пример передачи в функцию описанной ранее структуры House для вывода на экран названия улицы и номера дома, содержащихся в ней.
#include <iostream.h>
#include <string.h>
struct HOUSE
{
unsigned short RegNum;
char Street[51];
// а учетом '\0'
char HouseNum[6];
unsigned short MaxFloorNum;
unsigned short MaxFlatNum;
bool Parking;
};
void OutAddress(HOUSE);
int main ()
{
HOUSE MyHouse;
MyHouse.RegNum = 524;
strcpy(MyHouse.Street, "ул. Гоголя");
strqpy{MyHouse.HouseNum, "2-a");
MyHouse.MaxFloorNum = 7;
MyHouse.MaxFlatNum = 84;
MyHouse.Parking = true;
OutAddress (MyHouse) ;
return 0;
}
void OutAddress(HOUSE house)
{
cout « house.Street « ", "; cout « house.HouseNum « '\n';
}
Вызов функции OutAddress (MyHouse) передает в тело сформированную структуру, доступ к членам которой осуществляется в соответствии с описанным выше правилом, через символ 'точка' (.). В результате на экран будет выведено:
ул. Гоголя, 2-а
Массивы структур
Сама по себе одна единственная запись типа структуры в большинстве случаев вряд ли может вызывать повышенный интерес. Однако в случае, когда структурированные данные объединяются в массивы, речь идет уже не о единичном объекте, а о целой базе данных.
Объявление массива структур отличается от объявления обычных массивов лишь тем, что в качестве типа создаваемого массива указывается вновь образованный тип структуры. Таким образом, для создания базы данных, содержащей информацию о тридцати домах микрорайона, можно объявить следующий массив:
HOUSE mDistr[30];
Доступ к элементам такого массива осуществляется обычным способом, например, по индексу (индексация ведется, начиная с нуля). Следующий фрагмент кода осуществляет в цикле упорядоченное заполнение номеров домов структуры HOUSE, а затем выводит записанные данные в столбик на экран:
HOUSE mDistr[30];
for(int i=0; i<30; i++)
itoa(i+l,mDistr[i].HouseNum,10);
for(int i=0; i<30; i++)
cout « mDistrfi].HouseNum « '\n';
Напомним, что для работы функции преобразования целого числа в строку символов itoa() необходимо подключить модуль stdlib.h.
Поскольку запись структуры очень часто имеет внушительный размер (может включать в себя массивы элементов, другие структуры и т.д.), следует принимать во внимание ограничения по памяти при выборе соответствуюшей модели.