русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Определение шаблона структуры и структурной переменной


Дата добавления: 2014-05-02; просмотров: 693; Нарушение авторских прав


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

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

 

 
 


struct date{ int day; int month; int year; char mon_name[10]; }; имя (тег) структуры     элементы структуры (поля, члены-данные)
ключевое слово определение структуры (структурного типа, шаблона структуры)

 

Синтаксис определения структуры (структурного типа, шаблона структуры):

struct pattern_name { type1 field_name1;
type2 field_name2;
…..
typeN field_nameN;

};

или, в случае полей одного типа:

struct pattern_name { type1 field_name1, field_name2;
…..
typeK field_nameN;

};

 

где:

  • pattern_name – имя шаблона, удовлетворяющее правилам задания идентификаторов языка;
  • type1, type2, … typeN – любые типы;
  • field_name1, field_name2, …, field_nameN – имена полей, удовлетворяющие правилам задания идентификаторов языка.

Элементом структуры в С++ может быть и функция.

 

Примеры определений структурного типа:



//1

struct PointRecType //структурный тип «точка»

{ int x, y;

};

 

!!! Для определения точки можно использовать предопределенную в заголовочном файле windows.h структуру POINT, соответствующую структуре PointRecType.

 

//2

struct ColorPointRecType //структурный тип «цветная точка»

{ int x, y;

unsigned color;

};

//3

struct Book //структурный тип «книга»

{

char name [20];

char title[44];

int year;

float price;

};

//4

struct Auto //структурный тип «автомобиль»

{

char fio[40]; //ФИО владельца

char adres[60]; //адрес владельца

int nomer; //номер авто

char marka[20]; //марка авто

};

//5

struct Student //структурный тип «студент»

{

unsigned short gruppa;

char fio[20];

unsigned short ocenki[KOL_OC]; //массив оценок на экзамене

};

//6

struct Rectangle //структурный тип «прямоугольник»

{

int left; //пара координат верхней левой точки

int top;

int right; //пара координат нижней правой точки

int bottom;

};

!!! Для определения прямоугольных областей можно использовать предопределенную в заголовочном файле windows.h структуру RECT, соответствующую приведенной структуре Rectangle:

 

//7

struct Box //структурный тип «ящик»

{

double length; //длина

double width; //ширина

double heigth; //высота

};

 

Определение структурной переменной состоит из двух шагов:

· определение структурного типа (шаблона структуры, структуры);

· собственно определение структурной переменной

 

Определение структурных переменных s1 и s2 для приведенной выше структуры Student выглядит следующим образом:

Student s1, s2; //ключевое слово struct опускается

 

Синтаксис С++ разрешает совмещать определение структурного типа и определение структурных переменных. Например:

 

struct Book {char name[20]; определение структурного типа

char title[44];

int year;

float price; определение структурных переменных

} first_book, child_book, dog_book [4], *ptr_book;

 

Определение структурного типа может быть анонимным. В этом случае сразу следует определять структурные переменные. Например:

 

struct { // анонимный структурный тип

int pole1;

double pole2;

char *pole3;

} a, b, *pb=&b, *pc, &refa=a, &refb(b); // определение структурных переменных

 

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

Структурный тип может быть операндом операции new:

ptr_book = new Book; //выделяется память для структуры типа Book и
//возвращается указатель на выделенную память.

Для структур могут быть определены и ссылки. Выше в примере показаны разные способы инициализации ссылок refa и refb.

 

Доступ к полям структурной переменной возможен в виде:

имя_структуры . имя_элемента_структуры
// . – есть операция доступа к элементу (члену) структуры

имя_ссылки_на_структуру . имя_элемента_структуры

(*имя_указателя_на_структуру). имя_элемента_структуры

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

 

Для доступа к полям структурной переменной через указатель:
(*имя_указателя_на_структуру).имя_элемента_структуры

используется также операция ->:

имя_указателя_на_структуру -> имя_элемента_структуры

// -> – есть операция непрямого доступа к элементу (члену) структуры

 

В случае шаблона структуры:

struct date{

int day;

int mes;

int year;

char mon_name[10];

} x, y, *ptr_date= &x;

 

эквивалентны записи:

(*ptr_date).year и ptr_date->year

(*ptr_date).mon_name[0] и ptr_date->mon_name[0]

 

 

Имена полей одного типа можно перечислить через запятую.

Например:

struct PointRecType

{int x, y;

};

 

Имена полей в одном шаблоне структуры должны быть уникальными. Однако в разных шаблонах можно использовать совпадающие имена полей. Более того, имя шаблона может совпадать с именами полей и переменных. Поскольку имена полей «скрыты» внутри шаблона, они могут дублировать «внешние» переменные и поля в других описаниях структур.

Например:

struct PointRecType //определение шаблона структуры PointRecType

{ int x, y;

};

 

struct ColorPointRecType //определение шаблона структуры ColorPointRecType

{int x, y;

unsigned color;

};

 

struct // определение шаблона структуры без имени

{ PointRecType point;

ColorPointRecType color_point;

} big_struct; // определение структурной переменной big_struct

 

int x, y; //определение простых переменных

PointRecType point; //определение структурной переменной типа PointRecType

ColorPointRecType color_point ; //определение структурной переменной типа ColorPointRecType

Здесь x,
point.x,
color_point.x,
big_struct.point.x,
big_struct.color_point.x – разные значения.

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

Например:

 

struct Book { Book my_s; //error !!!!!

char name[20];

char title[44];

int year;

float price;

};

struct Book { Book & my_s; //error !!!!!

char name[20];

char title[44];

int year;

float price;

};

 

struct Book { Book *my_s; //OK!!!!!

char name[20];

char title[44];

int year;

float price;

};

 

Область видимости шаблона структуры:

· локальный шаблон структуры описан внутри блока { } и видим только из пределов данного блока, в частности из пределов конкретной функции;

· если описание шаблона структуры помещено вне блоков, такой шаблон видим во всех функциях ниже точки описания шаблона до границы файла. Нельзя описать шаблон с реквизитом extern.

 



<== предыдущая лекция | следующая лекция ==>
Структура как пользовательский тип и совокупность данных | Расположение структурных переменных в памяти


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.