Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора по яп 2.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
204.42 Кб
Скачать

38. Структуры

Структура позволяет объединить в одном объекте совокупность значений, которые могут иметь различные типы. Элементы структуры запоминаются в памяти последовательно в том порядке, в котором они объявляются: первому элементу соответствует меньший адрес памяти, а последнему – больший. Каждый элемент выравнен на границу, соответствующую его типу. Поэтому внутри структур могут появляться неименованные, пустые участки памяти между соседними элементами.

Пример 1:

struct { double x,y; } s1, s2, sm[9];

struct { int year;

char moth, day; } date1, date2;

struct {float x,y;} complex;

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

Пример 2:

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

struct address // почтовый адрес

{

char* name; // имя "Jim Dandy"

long number; // номер дома 61

char* street; // улица "South Street"

char* town; // город "New Providence"

char state[2]; // штат 'N' 'J'

int zip; // индекс 7974

} adr1,adr2;

Такое определение вводит новый производный тип, который будем называть структурным типом. В данном случае у этого структурного типа есть конкретное имя address. В соответствии с синтансисом языка определение структурного типа начинается со служебного слова struct, вслед за которым помещается выбранное пользователем имя типа. Определив структурный тип, можно определять и описывать конкретные структуры, т.е. структурированные объекты.

Если структура определяется однократно, то нет необходимости вводить именованный структурный тип. Достаточно определять структуры одновременно с определением их компонентного состава.(см. Пример 1)

Определение структурного типа может быть совмещено с определением конкретных структур этого типа.

При обращении к объектам, входящим в качестве элементов в конкретную структуру, чаще всего используются уточненные имена. Доступ к компонентам структуры осуществляется с помощью указания имени структуры и cледующего через точку имени выделенного компонента.

Пример 3:

address jd;

jd.name = "Jim Dandy";

jd.number = 61;

Запись, которая использовалась для инициализации векторов, можно применять и к переменным структурных типов.

Пример 4:

address jd =

{"Jim Dandy",61, "South Street","New Providence", {'N','J'}, 7974}; Заметьте, что нельзя было бы инициализировать jd.state строкой "NJ". Строки оканчиваются символом '\0', поэтому в "NJ" три символа, то есть на один больше, чем влезет в jd.state.

К структурным объектам часто обращаются посредством указателей используя операцию -> доступа к элементу структуры, с которой в этот момент связан указатель.

Пример 5

struct mystruct

{int i;

char str[21];

double d;

} s, *sptr=&s;

s.i = 3;

sptr->d = 1.23;

printf("%d \n",s.i);

printf("%d \n",sptr->i);

Следует отметить, что в языке С реализован ограниченный набор операций над структурами как единым целым:

  • передача функции в качестве аргумента,

  • возврат в качестве значения функции,

  • получение адреса.

Пример 6:

address current;

address set_current(address next)

{

address prev = current;

current = next;

return prev;

}

Остальные осмысленные операции, такие как сравнение (= = и !=) не определены. Однако пользователь может определить эти операции.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]