If ( S.Sex )

Else

Else

If (S.Sex)

Void WriteStudent (t_Student S)

Структурные параметры функций

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

Любая структурная переменная занимает в памяти определенное положение, характеризующееся конкретным адресом. Для работы с адресами структурных переменных (как и для простых переменных) можно использовать указатели. Указатели на структурные переменные определяются точно так же, как и для обычных переменных:

t_Student * p_Stud; // Переменная p_Stud указатель на тип данных t_Student

p_Stud = & St1; // Переменной p_Stud присвоен адрес переменной St1

Разыменование указателя (обращение к данным по адресу, хранящемуся в указателе) осуществляется обычным образом:

St2 = * p_Stud; // Данные по адресу p_Stud скопированы в переменную St2

Через указатели можно работать с отдельными полями структур. Для доступа к полю структуры через указатель используется оператор “стрелка”, а не “точка”:

grade = St1.Grade; // Доступ к полю Grade через обычную структурную переменную с помощью оператора “точка”

grade = p_Stud -> Grade; // Доступ к полю Grade через указатель на структурную переменную с помощью оператора “ стрелка”

p_Stud -> Grade = 3.75; // Полю Grade через указатель на структурную переменную присвоено новое значение

Структуры можно использовать в качестве параметров функций, как и обычные переменные. Для структур поддерживаются все три механизма передачи данных – по значению, через указатели и по ссылке.

Напишем три варианта функции, выводящей на экран данные студента.

Вариант 1. Передача данных по значению:

{

cout << setw(14) << "Фамилия: " << S.Fam << endl;

cout << setw(14) << "Имя: " << S.Name << endl;

cout << setw(14) << "Год рождения: " << S.Year << endl;

cout << setw(14) << "Пол: " << "М\n";

cout << setw(14) << "Пол: " << "Ж\n";

cout << setw(14) << "Средний балл: " << S.Grade << endl;

}

В этом варианте функции используется передача данных структуры по значению. Вызов этой функции WriteStudent (St1); сопровождается дополнительным расходом памяти для создания локальной переменной S и дополнительными затратами времени на физическое копирование данных из аргумента St1 в параметр S. Учитывая то, что объем структур может быть очень большим, то эти дополнительные затраты вычислительных ресурсов могут быть чрезмерными. Поэтому передачу структур в функции по значению необходимо использовать аккуратно.

Вариант 2. Передача данных через указатель:

void WriteStudent (t_Student *S)

{

cout << setw(14) << "Фамилия: " << S -> Fam << endl;

cout << setw(14) << "Имя: " << S -> Name << endl;

cout << setw(14) << "Год рождения: " << S -> Year << endl;

if (S -> Sex)

cout << setw(14) << "Пол: " << "М\n";

cout << setw(14) << "Пол: " << "Ж\n";

cout << setw(14) << "Средний балл: " << S -> Grade << endl;

}

Вызов этой функции: WriteStudent (&St1);

В этом варианте фактической передачи данных студента в функцию не осуществляется. Дополнительные затраты памяти для создания локальной переменной небольшие – это адрес памяти (4 байта, независимо от размера самой структуры). Вызов такой функции будет осуществляться быстрее, а расход памяти существенно меньше, чем в первом варианте.

Здесь следует обратить внимание на то, что обращение к полям записи должно осуществляться с помощью оператора “стрелка”.

Вариант 3. Передача данных по ссылке:

void WriteStudent (t_Student &S)

{

cout << setw(14) << "Фамилия: " << S.Fam << endl;

cout << setw(14) << "Имя: " << S.Name << endl;

cout << setw(14) << "Год рождения: " << S.Year << endl;

cout << setw(14) << "Пол: " << "М\n";


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



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