Передача всей структуры в функцию

Формальным параметром функции может являться вся структура. При вызове такой функции тип структуры, используемой в качестве фактического параметра, должен соответствовать типу формальной структуры. Для этого, как правило, структурный тип определяется глобально, например, тот же tst, а затем используется это имя как при описании функции, так и при её вызове.

Как и для обычных переменных, возможна передача структур в функцию одним из трёх способов: 1) по значению, 2) по ссылке, 3) с помощью указателя.

1) Пусть заголовок функции такой:

void Fun1 (tst S,…);

Многоточие означает, что кроме структуры, могут быть и другие параметры функции. В её тексте можно использовать поля структуры

S.m, S.per, S.p и *(S.p), S.ard и S.ard[j], S.t и S.t[k],

где j является индексом динамического массива ard, а k — индекс для строки t. В вызывающей функции объявляем структурную переменную, определяем её поля и вызываем функцию:

tst S1; …; Fun1 (S1,…);

В этом случае структуры S1 и S занимают разные участки памяти, т. е. при выполнении функции S1 копируется в S. Поэтому изменение полей структуры S в функции не влечёт за собой изменения соответствующих полей структуры S1.

2) Если надо в функции получить структуру или изменить некоторые или все её поля, то используем ссылку на структуру. Тогда заголовок функции будет таким:

void Fun2 (tst & S,…);

В ней, как и в первом варианте, можно использовать поля структуры с теми же обозначениями:

S.m, S.per, S.p и *(S.p), S.ard и S.ard[j], S.t и S.t[k].

В вызывающей функции объявляем переменную аналогично: tst S2; и вызываем функцию:

Fun2 (S2,…);

В этом случае в отличие от предыдущего варианта структуры S2 и S занимают один и тот же участок памяти, т. е. одна и та же структура в функции Fun2 названа S, а в вызывающей — S2. Поэтому изменение структуры S будет передано в структуру S2.

3) Более профессиональным, классическим способом возврата структуры из функции является использование указателя на структуру. В этом случае заголовок функции будет таким:

void Fun3 (tst* S,…);

В ней доступ к полям этой структуры выполняется с помощью рассмотренной ранее операции “стрелка” (“->”) и, если надо, операции разыменование (“*”):

S->m, S->per, S->p и *(S->p), S->ard и S->ard[j], S->t и S->t[k].

Если в вызывающей функции объявлена “обычная” переменная структурного типа, а не указатель (tst S1;), то вызываем функцию так: Fun3 (&S1,…); Если в вызывающей функции объявлен указатель на структуру (tst* pS;), то его надо не забыть определить одним из рассмотренных ранее способов, например, pS= new tst; Тогда функцию вызываем так: Fun3 (pS,…);

При использовании указателей структуры не копируются, а копируются только адреса. Другими словами, как будто выполняется присваивание S=pS, которое в программе, конечно, явно не записывается. После этого S и pS содержат адреса начала одного и того же участка памяти, в котором один раз хранится структура. В функции Fun3 доступ к ней осуществляется с помощью указателя S, а в вызывающей функции — с помощью указателя pS.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: