adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
слова 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. В конец структуры при необходимости добавляется ко-
нечный байт, таким образом, чтобы вся структура в целом за-
нимала четное количество байтов.
|
adfun.ru
|
|
|
|