Например, для переменных, описанных шаблоном

struct STUDENT { char name [30]; int ball [4]; float sb;

} st1, st2, gr [20], *pst;

допустимы следующие ссылки на поле структуры:

st1.name – указатель-константа на первый элемент массива name,

st2.ball [1] – ссылку на элемент с индексом 1 массива ball,

&st1.sb – адрес первого байта поля sb,

а также возможны ссылки вида gr [i].ball [4], gr [i+1].ball[k +1] и т.д.

Ссылка на поле структурной переменой обладает всеми свойствами обычной переменной. Корректны следующие выражения:

scanf (“%s”, st1.name); /* ввод Фамилии И.О. */

st.sb = 0; /* обнуление поля структуры */

gr [i].sb = st1.sb; /* копирование поля структуры */

strcpy (gr [i].name, st1.name); /* вызов библиотечной функции */

Если структурные переменные описаны одним и тем же шаблоном, допускается операция присваивания таких структурных переменных, например,

st2 = st1; /* переменная st1 предварительно должна быть определена */

gr[i] = st1;

Операция присваивания структурных переменных приводит к пересылке (копированию) в памяти всех байтов одной переменной другой переменной.

Для доступа к полям структурной переменной через указатель используется операция ‘->’ (стрелка) по схеме:

указатель -> поле_структуры.

Ссылка на поле структурной переменной через указатель может участвовать в выражениях и операторах аналогично простой переменной, например,

pst1 = &st1; /* запись адреса структуры в указатель */

pst1 -> name = ”Иванов А.С. ”; /* запись литерала в поле name */

scanf (“%f”, &pst ->sb); /* запись числа в поле sb */

Вообще говоря, ссылка на поле структурной переменной через указатель – это синоним ссылки на данное поле через операцию ‘.’, например ссылка
pst ->sb может быть записана, как (*pst).sb.

Ссылка на поле вложенной структуры формируется в виде цепочки имен переменной и полей структур по схеме (для не указателя):

переменная. имя_внешней_структуры. поле_внутренней_структуры

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

struct data { int day; int month; int year;}; /* шаблон структуры */

struct STUDENT { char name[30];

struct DATA born; /* вложенная структура */

} st, *pst=&st; /*переменная и указатель на структуру*/

возможны выражения:

st.born.day = 15;

st.born.month = 2;

st.born.year = 1979;

В общем случае доступ к полям вложенных структур подчиняется правилу: если в цепочке переменных и полей есть указатель, то доступ через него осуществляется по операции ‘->’, а если не указатель – по операции ‘.’, например,

pst->born.day = 20;.

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

Например, предыдущее описание структур можно изменить:

struct STUDENT { struct DATA *pborn; /* struct DATA описана ниже */

char name [30];

};

struct DATA { int day; int month; int year; /* шаблон структуры */

};

struct student st, *pst=&st; /* переменная и указатель на структуру */

Доступ к полям в операторах с указателями:

pst -> pborn -> day = 25; /* запись числа в поле day */

scanf (“%d”, &pst -> pborn -> month); /* ввод числа в поле month */


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



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