Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Курс Лекций ОАиП.doc
Скачиваний:
65
Добавлен:
21.03.2016
Размер:
5.89 Mб
Скачать

7.10 Структурные переменные и указатели

Для любого типа T тип T* означает «указатель на объект типа Т». Указатель является объектом (переменной), хранящим адрес другого объекта. В случае, если указатель используется для хранения адреса объекта типа структуры, то доступ к полям структуры может быть осуществлён двумя способами.

Предположим, что в программе сделано описание:

struct vec

{

double x, y;

};

vec v1, *v2;

Здесь v1 структура типа vec, v2 – указатель на структуру типа vec. Для выбора полей x, y структуры необходимо использовать конструкции : (*v2).x, (*v2).y. Действительно, v2 – адрес структуры, *v2 – сама запись. Круглые скобки здесь необходимы, т.к. точка (.) имеет более высокий приоритет, чем звездочка (*).

Для доступа к полям структурной переменной через указатель структуры можно использовать специальную операцию -> (минус больше). Например, v2->x, v2->y.

Т.о., конструкции (*v2).x, (*v2).y и v2->x, v2->y

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

7.11 Массивы структурных переменных

Описание массива структур не отличается от описания массива обычных переменных.

Пример:

Struct Man

{

char fio[31]; // ФИО

int year; // Год рождения

float pay; // Оклад

};

Man d[100], *p=d; // массив структур d из 100 элементов и

// указатель p, инициализированный адресом

//первого элемента массива d

Примеры обращения к полям:

d[i].year, (*(d+i)).year, (d+i)->year, ( p+i)-> year

7.12 Пример программы работы со структурами

#include <stdio.h>

main()

{

/* Описание шаблона структуры */

struct Student

{ char *fio; // Фамилия - указатель на char

char Adress[40]; // Адрес - строка

int Age; // Возраст - целое

int oc[4]; // Оценки - целочис. массив

float sr; // Средний балл - вещественное

} ;

struct Student S; // Описание структурной переменной S

int i;

float sr;

S.fio="Петушков"; //Присваивание полю значения

printf("Введите адрес студента %sa ",S.fio);

gets(S.Adress); //Ввод значения поля

S.Age=1987; //Присваивание полю значения

S.oc[0]=3;

S.oc[1]=5;

S.oc[2]=4;

S.oc[3]= S.oc[2];

sr=0; //Вычисление

for(i=0;i<=3;i++) //среднего

sr=sr+S.oc[i];

sr=sr/4; //балла

S.sr=sr; //Присваивание полю значения

printf(" Средний балл студента %sа",S.fio);

printf(" %d года рождения,\n проживающего по адресу: %s,",

S.Age,S.Adress);

printf(" равен %5.2f\n",S.sr);

fflush(stdin); getchar(); return(0);

}

Вид экрана после выполнения программы:

Введите адрес студента Петушковa ул. Солнечная, д.1, кв. 4

Средний балл студента Петушкова 1987 года рождения,

проживающего по адресу: ул. Солнечная, д.1, кв. 4, равен 4.00