Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
04-09-2015_19-17-13 / Конспект лекций.doc
Скачиваний:
98
Добавлен:
01.03.2016
Размер:
1.31 Mб
Скачать

5. Базовые и производные типы данных. Массивы. Указатели, ссылки и адреса. Структуры. Поля битов. Объединения

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

• char (символьный);

• short (короткий целый);

• int (целый);

• long (длинный целый);

• float (вещественный);

• double (вещественный с удвоенной точностью);

• void (отсутствие значения).

Из этих базовых типов с помощью операций * & [] () и механизмов определения типов структурированных данных (классов, структур, объединений) можно конструировать множество производных типов. Обозначим именем type1 допустимый тип, приведем форматы некоторых допустимых типов:

5.1 Массивы

  • type имя [ <константное выражение >] – массив объектов заданного типа type. Константное выражение – выражение целого типа, указывающее количество элементов массива. Например: long int[5] – массив из 5 объектов типа long int. В случае, когда массив не определяется, а описывается, список начальных значений задавать нельзя. В описании массива может отсутствовать и его размер. Например, extern unsigned long UL[] – описание внешнего массива, который определен в другой части программы, где ему выделена память и возможно начальные значения его элементам. При определении массива может выполнятся его инициализация, т.е. элементы массива получают конкретные значения. Явная инициализация элементов массива разрешена только при его определении и возможна двумя способами: либо с указанием размера массива в квадратных скобках, либо без явного указания размера, в этом случае количество элементов компилятор определяет по числу начальных значений в обязательном списке инициализации:

char CH[] = {‘A’,’B’,’C’,’D’};

int IN[7]={1,2,3}; // массив из 7 элементов, первые 3 из которых - 1,2,3

char str[]=”ABCD” // массив из 5 элементов

Имя массива является указателем-константой, значением которой служит адрес первого элемента массива (с индексом 0), т.е.

имя_массива == & имя_массива == & имя_массива[0]

5.2 Указатели, ссылки и адреса объектов

type *имя – указатель на объект типа type. Например char *ptr – указатель на объекты типа char, char *str = “stroka” – указатель на массив из 7 элементов.

type *имя[] – массив указателей на объекты типа type

type (*имя)[] – указатель на массив объектов типа type

type1 *имя (type2) – функция, принимающая аргумент типа type2 и возвращающая указатель на тип type1.

type1 (*имя) (type2) - указатель на функцию, принимающую аргумент типа type2 и возвращающую тип type1.

type1 *(*имя)(type2) – указатель на функцию, принимающую параметр type2 и возвращающую указатель на тип type1.

type &имя = имя_объекта_типа_type – инициализированная ссылка на объект типа type.

type1 (&имя)(type2) - ссылка на функцию c параметром type2 , возвращающую значение типа type1

5.3 Структуры

Cтруктуры - это составной объект, в который входят элементы любых типов, в том числе и фунции. В отличие от массива, который является однородным объектом, структура может быть неоднородной. Тип структуры определяется записью вида:

struct { список определений; }

В структуре обязательно должен быть указан хотя бы один компонент. Определение структур имеет следующий вид:

Тип_данных_структуры описатель;

где тип_данных_структуры указывает тип структуры для объектов, определяемых в описателях. В простейшей форме описатели представляют собой идентификаторы или массивы.

Пример:

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

struct { int year;

char moth, day; } date1, date2;

Переменные s1, s2 определяются как структуры, каждая из которых состоит из двух компонент х и у. Переменная sm определяется как массив из девяти структур. Каждая из двух переменных date1, date2 состоит из трех компонентов year, moth, day. Существует и другой способ ассоциирования имени с типом структуры, он основан на использовании тега структуры. Тег структуры аналогичен тегу перечислимого типа. Тег структуры определяется следующим образом:

struct тег { список описаний;};

где тег является идентификатором.

В приведенном ниже примере идентификатор student описывается как тег структуры:

struct student {

char name[25];

int id, age;

char prp;};

Тег структуры используется для последующего объявления структур данного вида в форме:

struct тег список-идентификаторов;

Пример:

struct studeut st1,st2;

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

struct node {

int data;

struct node * next;

} st1_node;

Тег структуры node действительно является рекурсивным, так как он используется в своем собственном описании, т.е. в формализации указателя next. Структуры не могут быть прямо рекурсивными, т.е. структура node не может содержать компоненту, являющуюся структурой node, но любая структура может иметь компоненту, являющуюся указателем на свой тип, как и сделано в приведенном примере.

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

st1.name="Иванов";

st2.id=st1.id;

st1_node.data=st1.age;

При наличии указателя на структуру имеется еще одна возможность доступа к компонентам структуры через операцию ->. Формат соответствующего выражения следующий:

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

Также можно использовать традиционный способ доступа к переменным через указатель:

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

Как и для других объектов, для структур могут быть определены ссылки:

имя_структурного_типа & имя_ссылки_на_структуру инициализатор

Например:

typedef struct {int field1; char *field2;} A;

A a,b;

A& refA = a;

A& refB(b);

Соседние файлы в папке 04-09-2015_19-17-13