Имя_структурной_переменной. имя_поля

Struct date today;

Лекция №9. СТРУКТУРЫ

Строка как массив символов

Строка представляет собой массив значений типа char, завершающийся нулевым байтом. В этом массиве, как в массивах других типов, если с является переменной типа char, то оператор c=name[3];присваивает четвертый элемент массива name переменной с (первый содер­жится в элементе name[0]).

Инициализация строки: char HDD[]="Fujitsu-4.5";

Только строка HDD имеет длину 12 байт, а не 11 - по числу символов, так как строки имеют невидимый нулевой завершающий байт. Поэтому используя традиционные методы инициализации массивов, программисту необходимо помнить о завершающем нулевом байте. Таким образом, объявление char MyABCs[]="ABC"; является точным эквивалентом объявления char MyABCs[]={'A','B','C',0};

Для определения константы, равной длине инициализированной строковой переменной, можно воспользоваться функцией sizeof():

char M_Board[]="Iwill P55XB2";

#define M_B (sizeof(M_Board))

Здесь M_Board - строка, инициализированная как "Iwill P55XB2", a M_B - константа, равная размеру массива в байтах, включая завершающий нулевой символ.

Для отображения строки на экране используется функция printf():

char company[]="Borland International";

printf(company);

или

printf("%s\n",company);

или функция puts() из заголовочного файла STDIO.H

puts(company); //печать строки на экране и перевод

// курсора на следующую строку

Чтобы напечатать текст и оставить курсор в конце напечатанной строки, следует пользоваться функцией cputs() из заголовочного файла CONIO.H: cputs(company);

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

Для объявления структуры (или структурного шаблона) используется ключевое слово struct, за которым следуют идентификатор, являющийся именем типа структуры, и список полей или членов структуры, заключенных в фигурные скобки. Каждый член объявляемой структуры, как и структура в целом, заканчивается точкой с запятой:

stract date {

int day;

int month;

};

Для того чтобы получить возможность использования структуры, следует сначала объявить переменную структурного типа. Это можно сделать двумя способами:

2) struct date {int day; int month; } today;

Второй способ одновременно объявляет структуру (структурный шаблон) и выделяет память под переменную структурного типа. При объявлении нескольких структурных переменных для одной структуры их следует разделять запятыми: struct date dl,d2,d3;

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

Обычно псевдоним начинается с большой буквы, но это не безусловное требование языка, а лишь соглашение.

Например, typedef int Counter; делает псевдоним Counter эквивалентом int, после этого можно делать объявления: Counter i;

Использование typedef при объявлении структур позволяет в дальнейшем опускать ключевое слово struct при объявлении структурных переменных.

Допустимо отсутствие идентификатора структуры. В любом случае псевдоним Date также представляет объявленный структурный тип данных.

Например:

typedef struct date { typedef struct {

int day; int day;

int month; int month;

} Date; } Date;

Доступ к членам структуры осуществляется записью вида:

Другими словами, если объявлено Date today; то можно записать

today.day = 12; today.month = 4;

Структуры могут содержать в качестве своих полей или членов переменные любых типов, в том числе массивы или другие структуры.

Например:

typedef struct bigstr

{float f; //поле структуры - переменная типа float

char st[80]; //поле структуры - массив из 80 символов

double d[25]; // поле структуры - массив из 25

// действительных чисел двойной точности

} BigStr;

Недопустимо присваивание структур разных типов, даже в том случае, когда эти типы идентичны по количеству, типу и размеру их полей.

Несмотря на возможность присваивания значений однотипных струк­турных переменных, сравнивать их нельзя:

Побайтовое сравнение не является надежным, так как различные компиляторы ведут себя по-разному. Единственный доступный способ достоверно сравнить структурные переменные - это их поэлементное сравнение:

if ((d1.day=d2.day) && (d1.month=d2.month)) оператор;

Если полем структуры является другая структура, то получается вложенная структура.

Для доступа к вложенным полям структур используют число точек, достаточное для осуществления такого доступа. Например: DateTime dt; тогда можно записать: dt.today.year=2001; dt.now.minute=27;

При этом слева от точки располагается имя структурной переменной, а справа - имя поля структуры: dt - структурная переменная, today - поле структурной переменной dt; today - структурная переменная, year - ее поле; now - структурная переменная, minute - ее поле.

Структура не может объявить в качестве члена структуру своего типа, т.e. структура не может объявить членом саму себя, кроме случаев использования указателей.

Поля структур могут быть представлены переменными любого типа, кроме функций.

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

Существуют две основные комбинации: массивы структур, структуры с полями, являющимися массивами.

Описание массива структур совершенно аналогично описанию массива любого другого типа. Каждый элемент массива представляет собой структуру объявленного типа.

При определении элементов массива структур применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и именем элемента: Addr Homes[10];

Индекс массива присоединяется к имени массива структурного типа, а не к концу конструкции, осуществляющей доступ к полям структуры:

Homes.town[2]; // неправильно

Homes[3].street; // правильно

В то же время Homes[2].street[4] - вполне допустимая запись с точки зрения компилятора, так как street - тоже массив. При этом получаем доступ к пятому элементу массива street, который в свою очередь является членом третьего элемента массива Homes. Таким образом, рассмотрели использование массива в качестве элемента структуры.

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