Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
29.04.2018
Размер:
824.83 Кб
Скачать

Void f(struct man *q)

{ ... }

Инициализация структур

и доступ к компонентам

Структуры могут быть инициализированы списками значений элементов, заключенных в фигурные скобки и перечисленных через запятую, как и массивы:

struct Student

{ char *name;

int id, age;

char pol;

} ;

Student st1 = {“Петров”, 1, 20, ‘М’};

Доступ к компонентам структуры осуществляется при помощи составных имен двумя способами.

  1. С использованием операции принадлежности .   

st1.name = “Сидоров”;

st2.id = st1.id;

2. Для работы с указателями на структурированные переменные существует специальная операция косвенной адресации  –>  (минус-больше), которая понимается как выделение элемента в структурированной переменной, адресуемой указателем.

Student *pA, A;

pA = &A;

pA > age; //эквив. (*pA).age

Можно проконтролировать значения полей после инициализации при отладке в окнах Видимые, Локальные, Контрольные значения

(Отладка / Окна / Контрольные значения / Контрольное значение 1 (2, 3, 4)).

Можно также посмотреть распределение памяти:

Отладка / Окна / Память / Память 1

(2, 3, 4)

Здесь адрес st10x0012FF54, внутри которого хранится адрес name - 0x00415830, внутри которого содержится текст Петров.

По адресу 0x0012FF58 содержится id = 1.

По адресу 0x0012FF5c содержится age = 14 (или 20 в десятичной системе счисления).

Доступ к полю, например, id возможен только с использованием операции принадлежности: st1.id. Чтобы посмотреть адрес надо ввести в окне Контрольное значение адрес &st1.id

С помощью оператора sizeof можно определить общую длину полей структуры:

int k = sizeof(st1);

cout<<k;

Например, для структуры

struct Student

{ char *name;

int id, age;

char pol;

} ;

длина равна 16.

Длина *name - 4 байта, id - 4 байта, age - 4 байта, char pol – 1 байт и добавляется 3 байта, чтобы выровнять до 4.

Работа со структурами поддерживается средствами  Intellisense. По мере ввода членов структуры вслед за именем структурированной переменной редактор показывает окно со списком всех членов данной структуры.

Допустимыми операциями являютcя следующие:

  • операция присваивания одной структуры другой структуре того же типа;

  • операция взятия адреса (&) структуры;

  • операция доступа к элементам структуры;

  • операция sizeof для определения размера структуры.

Остальные операции, такие как сравнение (== и !=), не определены.

Пример. Информация о студентах содержит фамилии, имена и оценки. В программе вводятся данные, и определяется средний балл. Вывод результатов осуществляется в порядке возрастания средних баллов.

#include <iostream>

using namespace std;

struct Student

{ char fam[30];

Int mark[4];

float sr;

};

Student St[30], buf;

Void main()

{ setlocale(LC_ALL, "Rus");

int i, j, n = 0;

do

{ cout<<"Фамилия ";

cin>>St[n].fam;

for (i = 0; i < 4; i++)

{ cout<<"Введите оценку по экзамену № "<< i + 1<<' ';

cin>>St[n].mark[i];

}

n++;

cout<<"Прекратить ввод? (0 - да, 1 - нет) ";

cin>>i;

} while(i);

for (i = 0; i < n; i++)

{ St[i].sr = 0;

for (j = 0; j < 4; j++)

St[i].sr += St[i].mark[j];

St[i].sr /= 4;

}

for (i = 0; i < n - 1; i++)

for (j = i; j < n; j++)

if (St[i].sr > St[j].sr)

{ buf = St[i];

St[i] = St[j];

St[j] = buf;

}

for (i = 0; i < n; i++)

{ cout<<"Студент "<<St[i].fam;

cout<<" Средний балл = " << St[i].sr << endl;

}

}

Указатель на структуру как формальный параметр

Объекты типа структур можно передавать как параметры функции. Пусть имеется структура:

struct man

{ char name[20];

int d, m, y;

char *addr;

}

A, X[5], B = {"Ivan", 12, 4, 2000};

Фрагмент ниже содержит указатель на структуру man *p в качестве формального параметра, а &B в основной программе – фактический параметр.

Соседние файлы в папке Лекции