Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
17.04.2015
Размер:
42.1 Кб
Скачать

4. Примеры структур

Структура в си, содержащая информацию о точке в двумерном пространстве (координаты):

struct Point{

double x, y;

};

Структура в си, содержащая информацию об окружности (координаты центра и радиус):

struct Circle{

double x, y, radius;

};

Структура в си, содержащая информацию о студенте (фамилия, имя, отчество, номер зачетной книжки, средний балл):

struct Student{

char surname[15], name[15], patronymic[15];

unsigned number;

double rate;

};

Объявление переменной определенной структуры осуществляется после описания данной структуры в следующем виде:

struct тип имя №1[= значение №1][,...];

struct Point pnt[3] = {{0,0},{1,0},{0,1}};

struct Circle c1 = {10.0,10.0,5.0},

c2 = {0.0,0.0,25.0};

struct Student st

= {"Иванов”,”Иван”,”Иванович”,959623,7.5};

struct Group gr ={

"97-BC”, 3, {

{"Иванов”, ”Иван”, ”Иванович”, 979601,8.0},

{"Петров”, ”Петр”, ”Петрович”, 979602,6.5},

{"Сидоров”,”Сидор”,”Сидорович”,979603,9.0}

}

};

Как правило, члены структуры связаны друг с другом по смыслу. Например, элемент списка рассылки, состоящий из имени и адреса логично представить в виде структуры. В следующем фрагменте кода показано, как объявить структуру, в которой определены поля имени и адреса. Ключевое слово struct сообщает компилятору, что объявляется (еще говорят, "декларируется") структура.

struct addr

{

char name[30];

char street[40];

char city[20];

char state[3];

unsigned long int zip;

};

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

В данном случае на самом деле никакая переменная не создается. Всего лишь определяется вид данных. Когда вы объявляете структуру, то определяете агрегатный тип, а не переменную. И пока вы не объявите переменную этого типа, то существовать она не будет. Чтобы объявить переменную (то есть физический объект) типа addr, напишите следующее:

struct addr addr_info;

В этом операторе объявлена переменная типа addr, которая называется addr_info. Таким образом, addr описывает вид структуры (ее тип), a addr_info является экземпляром (объектом) этой структуры.

Когда объявляется переменная-структура, компилятор автоматически выделяет количество памяти, достаточное, чтобы разместить все ее члены. На рис. 7.1 показано, как addr_info размещена в памяти; в данном случае предполагается, что целые переменные типа long занимают по 4 байта.+------------------------------------------+

|Name (имя) 30 байт |

+------------------------------------------+

+-------------------------------------------------+

|Street (улица) 40 байт |

+-------------------------------------------------+

+-----------------------------------+

|City (город) 20 байт |

+-----------------------------------+

+---------------------+

|State (штат) 3 байта |

+---------------------+

+----------------------------+

|Zip (код) 4 байта |

+----------------------------+

Рис. 7.1. Расположение в памяти структуры addr_info

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

struct addr {

char name[30];

char street[40];

char city[20];

char state[3];

unsigned long int zip;

} addr_info, binfo, cinfo;

определяет тип структуры, называемый addr, и объявляет переменные этого типа addr_info, binfo и cinfo. Важно понимать, что каждая переменная-структура содержит собственные копии членов структуры. Например, поле zip в binfo отличается от поля zip в cinfo. Изменения в zip из binfo не повлияют на содержимое поля zip, находящегося в cinfo.

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

struct {

char name[30];

char street[40];

char city[20];

char state[3];

unsigned long int zip;

} addr_info;

В этом случае объявляется одна переменная с именем addr_info, причем ее поля указаны в структуре, которая предшествует этому имени.

Общий вид объявления структуры такой:

struct тег {

тип имя-члена;

тип имя-члена;

тип имя-члена;

.

.

.

} переменные-структуры;

причем тег или переменные-структуры могут быть пропущены, но только не оба одновременно.

5. Оператор typedef.

В язык Си введено специальное средство, позволяющее назначать имена типам данных (переименовывать). Таким средством является оператор typedef. Он записывается в следующем виде:

typedef тип имя;

Здесь "тип" - любой разрешенный тип данных и "имя" - любой разрешенный идентификатор.

Рассмотрим пример:

typedef int INTEGER;

После этого можно сделать объявление:

INTEGER а, b;

Оно будет выполнять то же самое, что и привычное объявление int a,b;. Дру-гимисловами, INTEGER можно использовать как синоним ключевого слова int.

Соседние файлы в папке Л№23.Структуры.ООП