Отдельные структурные переменные с произвольным шаблоном, как и обычные переменные любого типа, могут быть объединены в массивы фиксированной длины:
struct BOOK
{ string author; // Автор книги
stringtitle ; // Название книги
intjear; // Год издания
intn; // К- во странниц
}catalog[10];// Массив структур
Имя catalog объявлено как массив 10 структур с общим шаблоном BOOK. Обращение к элементом отдельной структуры производится, как и ранее, с использованием операции – точки. Например, обращение вида
catalog[3].title[4];
задает пятый символ массива title в составе четвертого элемента массива структур catalog.
Тип struct – совершенно полноправный тип данных языка С++. Поэтому на этот тип можно объявить указатель. В отличие от массива, имя структурной переменной не эквивалентно ее адресу. Адрес можно получить известным образом:
DATEdata_1; // Объявление структурной переменной
DATE *pt; // Создание указателя на структуры данного типа
pt = &data_1; // Занесение в указатель адреса конкретной структуры типа DATA
При наличии указателя на структуру к элементам этой структуры можно обращаться с помощью операции –>. Например, pt–>year. Можно обращаться к элементу структуры и таким образом: (*имя_указа-теля).имя_элемента_структуры. Наличие круглых скобок обязательно. Таким образом, следующие три выражения эквивалентны:
(*pt).year; pt–>year; data_1.year.
Все они именуют один и тот же элемент intyear структурной переменной data_1, имеющий тип DATE.
Структуры могут быть параметрами функции и возвращаться в качестве результата работы функции. Структуры могут быть переданы в функцию по значению и через указатель.
При передаче по значению формальному параметру (структуре) передается копия фактического параметра (структуры). Эта копия может занимать «довольно много места», а процесс копирования – «много времени».
Пример 2
// Передача структуры в функцию по значению
#include <iostream>
struct man
{ string name;
int dd,mm,yy;
stringzodiak;
};
voidproc1(manB)// Формальный параметр – структура В с шаблоном
// man
{B.dd++;}
void main()
{ manA = {"Иванов И.И",1,10,1989,"Весы"};
proc1(A); //Фактический параметр – копия структуры А
// с шаблоном man
cout<<"A.dd="<<A.dd; //Выдача на экран – A.dd=1
}
При передаче структуры в функцию по значению изменить элементы этой структуры в функции невозможно. Обратите внимание, что программа определяет структуру man вне функции main и до функции proc1, поскольку функция объявляет переменную B типа man, и определение структуры man должно располагаться до функции.
Ели вы хотите с помощью функции изменять элементы структуры, то необходимо передавать ее адрес, тогда формальным параметром будет указатель на структуру (пример 3).
Пример 3
// Передача структуры в функцию через указатель
…
structman
{ …};
// Передача через указатель
void proc2(man *p) // Формальный параметр – указатель на
// структуру типа man
{p->dd++;}
void main()
{ man A={"Иванов И.И",1,10,1989,"Весы"};
proc2(&A);// Фактический параметр – адрес структуры А
cout<<"A.dd="<<A.dd; //Выдача на экран – A.dd=2
}
Структуры позволяют достаточно эффективно решить вопрос возврата множества значений из функции. Если функция должна вернуть несколько значений в качестве результата, то их достаточно поместить в структуру и возвращать значение указанного типа. Например, создать функцию, которая находит и возвращает в функцию main максимальный элемент матрицы, а также номер строки и столбца, на пересечении которых расположен этот элемент. С помощью структуры эта задача решается следующим образом:
structcoord // Описание структуры с именем coord
{ float pik;
int n_str,n_stl;
}
coord max_m(float *pt,int n,int m);// Возвращает структуру типа coord
void main()
{ coord man1;// Структура man1 построена по шаблону coord
floatc[4][5]={......};
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.