КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

Turbo C++ Version 1.0 Programmer’s Guide

Комментировать

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

слова struct. Например,

struct mystruct (* … *); // mystruct — это тег струк-
туры

struct mystruct s, *ps, arrs[10];
/* s имеет тип структуры mystruct; ps это указатель на
тип struct mystruct */
Структуры без тегов и определения типов (typedef)

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

Если тег структуры опущен, то получается структура без
тега. Такуюструктуру можно использовать для объявления иден-
тификаторов в разделяемом запятыми списке-идентификато-
ров-структуры как имеющих данный тип структуры (или являю-
щихся производными от него), но объявлять объекты этого типа
дополнительно где-либо еще нельзя:

struct (* …*) s, *ps, arrs[10]; //структура без тега

При объявлении структуры, как с тегом, так и без него,
можно создать typedef:

typedef struct mystruct (* … *) MYSTRUCT;
MYSTRUCT s, *ps, arrs[10]; // то же, что и
// struct mystruct s и т.д.
typedef struct (* … *) YRSTRUCT; // тег отсутствует
YRSTRUCT y, *yp, arry[20];

Обычно и тег, и typedef одновременно не нужны; вобъяв-
лениях структуры может быть использован любой из них.

Объявления компонентов структуры

Список-объявления-компонентов вфигурных скобках объяв-
ляет типы и имена компонентов структуры при помощи синтакси-
са декларатора, показанного в таблице 1.11 на стр.36
оригинала.

Компоненты структуры могут быть любого типа, за двумя
исключениями

1. Тип компонента не может быть тот же, что и объявляе-
мая в текущий момент структура:

struct mystruct (* mystruct s *) s1, s2;// недопустимо

Компонент структуры может являться указателем на объяв-

— 64 —
ляемую структуру, как в следующем примере:

struct mystruct (* mystruct *ps *) s1, s2; // так можно

Кроме того, структура может содержать ранее объявленные
типы структур, объявляя вхождения объявленных ранее струк-
тур.

В С++ ключевое слово struct может быть опущено.

2. Кроме С++, компонент структуры нигде не может иметь
тип «функция, возвращающая …», но тип «указатель на функ-
цию, возвращающую …» допустим. В С++ struct может иметь
компоненты-функции.

Структуры и функции

Функция может иметь возвращаемое значение типа структу-
ры или указателя структуры.

mystruct func1(void); // func1() возвращает структуру
mystruct
*func29void); // func2() возвращает указатель структуры

Структура можетбыть передана функции в качестве аргу-
мента, следующим образом:

void func1 (mystruct s); // непосредственно
void func2 (mystruct *sptr); // через указатель
void func3 (mystruct &sref); // по ссылке (только С++)
Доступ к компоненту структуры

Доступ к компонентам структур и объединений выполняется
операторами выбора . и ->. Предположим, что объект имеет тип
структуры S, а sptr это указатель на S. Тогда, если m это
идентификатор типа M, объявленного в S, то выражения s.m и
sptr->m имеют тип M и представляют объект m — компонент
структуры s. Выражение s->sptr является удобным синонимом (*
sptr).m.

Операция . называется прямым селектором компонента
структуры; операция -> называется косвенным селектором ком-
понента (или указателем) структуры; например,

struct mystruct (*

int i;
char str[21];
double d;
*) s, *sptr=&s;

s.i = 3; // присвоению члему i структуры mystruct s
sptr->d = 1.23; // присвоение компоненту d структуры
mystruct s

Выражение s.m является именуемым значением (lvalue),
если s это не именуемое значение и s не имеет тип массива.
Выражение sptr->m является именуемым выражением, если m не
имеет тип массива.
Если структура B содержит поле, тип которого есть
структура A, то доступ к компонентам A выполняется через два
одновременно задаваемых селектора компонента структуры:

— 65 —

struct A (*
int j;
double x;
*)

struct B (*
int i;
struct A a;
double d;
*) s, *sptr;

s.i = 3; // присвоение компоненту i структуры B s.a.j =
2; // присвоение компоненту j структуры A sptr->d = 1.23; //
присвоение компоненту d структуры B (sptr->).x = 3.14 //
присвоение компоненту x структуры A

Каждое объявление структуры вводит уникальный тип
структуры, поэтому в

struct A (*
int i,j;
double d;
*) a, a1;

struct B (*
int i,j;
double d;
*) b;

объекты a и a1 оба имеют тип struct A, но объекты a и b
имеют различные типы структуры. Структурам может выполняться
присваивание только в том случае, если и исходная структура,
и структура назначения имеют один и тот же тип:

a = a1;// так можно; тип один и тот же, поэтому может
быть // выполнено покомпонентное присвоение структур
a = b;// так нельзя; разные компоненты
a.1 = b.1; a.j = b.j; a.d = b.d; // однако присвоение
можно // выполнять на уровне компонентов структуры

Выравнивание по границе слова

Память распределяется структуре покомпонентно, сле-
ва-направо, от младшего к старшему адресу памяти. В следую-
щем примере

struct mystruct (*
int i;
char str[2];

double d;
*) s;

объект s занимает достаточное количество памяти для
размещения 2- байтового целочисленного значения, 21-байтовой
строки и 8-байтового значения типа double. Формат данного
объекта в памяти определяется опцией Turbo C++ выравнивания
по границе слова. Когда эта опция выключена (по умолчанию),
s будет занимать 31 байт непрерывно. Если же включить вырав-
нивание по границе слова опцией -a компилятора (или в диало-
говом поле Options \! Compiler \! Code Generation), то Turbo
C++ заполняет структуры байтами таким образом, что структура
была выравнена по следующим правилам:

— 66 —
1. Структура должна начинаться по границе слова (четный
адрес).

2. Любой не-символьный элемент будет иметь четное сме-
щение в байтах относительно начала структуры.

3. В конец структуры при необходимости добавляется ко-
нечный байт, таким образом, чтобы вся структура в целом за-
нимала четное количество байтов.

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *