Операции и доступ к компоненту структуры

Структуры

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

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

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

Описание структуры начинаются с ключевого слова struct и имеют два формата.

Формат 1

Struct

[ имя_типа_структуры ]

{ список_описаний_элементов }

[ список_идентификаторов ];

Квадратные скобки здесь обозначают необязательность элементов формата.

Формат 2

struct имя_типа_структуры список_идентификаторов;

То есть во втором формате мы уже ссылаемся на ранее определенный структурный тип.

В С++ имя типа структуры может использоваться точно так же, как и основные встроенные типы, поэтому слово struct можно опустить:

имя_типа_структуры список_идентификаторов;

Ниже приведен пример описания структуры типа DATE (дата):

struct DATE

{ int day;

char month[4];

int year; };

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

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

DATE date1,date2[20], * pntdate;

Рассмотрим структуру описывающую адрес

struct address

{ char state[21];

char town[21]; // город

char street[31]; // улица

char name[41];

int number; // номер дома

};

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

struct

{

char state[21];

char town[21]; // город

char street[31]; // улица

char name[41];

int number; // номер дома

} adres1, arrayadres[50]; .//.переменные

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

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

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

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

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

Операции и доступ к компоненту структуры

Над структурами определены только три операции:

- "&" - взятие адреса;

- "." - выбор элемента структуры с помощью имени структуры;

- "->" - выбор элемента структуры с помощью указателя;

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

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

пример: Прочитать из строки в файле все элементы структуры и вывести их в другой файл по полям.

#include <stdio>

struct address

{ char state[21];

char town[21]; // город

char street[31]; // улица

char name[41];

int number; // номер дома

};

void Out_Addr(address p,char *file_name)

{ FILE *file1;

file1=fopen(file_name,"w");

fprintf(file1,"%s\n%i\n%s\n%s\n%c%c\n",

p.name,p.number,p.street,p.town,p.state[0],p.state[1] );

fclose(file1);

}

void print_Addr(address p)

{ printf("%s\n%i\n%s\n%s\n%c%c\n",

p.name,p.number,p.street,p.town,p.state[0],p.state[1] );

}

//____

address *inp_Addr(char *file_name)

{FILE *file1;

address p1,*p=&p1;

file1=fopen(file_name,"r");

if (!file1)

fprintf(stderr, "\nCannot open %s for input",file_name);

else

{

fgets(p->name,40,file1);

fscanf(file1,"%i",&p->number);

fgets(p->street,30,file1);

fgets(p->town, 20,file1);

fgets(p->state,20,file1);}

fclose(file1);

print_Addr(*p);

return p;

}

void main(void)

{address s;

s=*inp_Addr("adr.txt");

Out_Addr(s,"adr_out.txt");

getchar();

}

исходный файл

Михайлов Степан Иванович 1 29ул. Политехническая 1Петербург Россия

результат

Михайлов Степан Иванович

ул. Политехническая

Петербург

Ро

Исходный файл

123456789_123456789_123456789_123456789 888y23456789_123456789_123456789g23456789_123456789c23456789_

результат

123456789_123456789_123456789_123456789

y23456789_123456789_123456789

g23456789_123456789

c2

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

К структуре можно применять операцию & вычисления ее адреса. Эту же операцию можно использовать и для получения адреса компонента структуры

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

Размер объекта структурного типа не обязательно равен сумме размеров всех его членов. Это происходит по той причине, что на многих машинах требуется размещать объекты определенных типов, только выравнивая их по некоторой зависящей от системы адресации границе (или просто потому, что работа при таком выравнивании будет более эффективной ). Типичный пример – это выравнивание целого по условной границе. В результате выравнивания могут появиться "дырки" в структуре.

Наши рекомендации