Синоним имени типа
Объединения
Объединения - это средство, позволяющее запоминать данные различных типов в одном и том же месте памяти. Объединение позволяет создавать массив, состоящий из элементов одинакового размера, каждый из которых может содержать различные типы данных.
Определяется также как и структура. Кючевое слово union. Есть шаблон определения и переменные этого типа.
union simbl {
int digit;
double bigfl;
char letter;
};
union simbl fit, save[10], *pu.
Компилятор выделяет память по наибольшему из элементов объединения bigfl (double 8 байт), для массива структур save[10] будет выделено (10 x 8) байт.
Как обращаться к элементу объеденения?
fit.digit=23; (использ. 2байта)
fit.bigfl=2.0 (23 стирается и записывается 2.0)
fit.letter='a' (2.0 стирается и записывается'a'в 1байт)
pu=&fit; x=pu->digit;
Все типы объединения начинаются с одного и того же адреса и в данный момент можно обратиться только к одному данному объединения.
В С++ можно создавать «безымянные» объединения. В объявлении безымянного объединения отсутствует как тег объединения, так и список объектов этого типа:
|
|
union {
int digit;
double bigfl;
char letter;
};
После появления такого объявления имена членов объединения могут использоваться подобно именам обычных переменных; при этом они все расположены в памяти, начиная с одного адреса.
digit=23;
bigfl=2.0
Безымянные объединения очень удобно использовать в качестве членов структур.
Встречаются ситуации, когда удобно ввести синоним для имени некоторого типа.
Строится синоним имени с помощью ключевого слова typedef.
Примеры:
typedef int INT //INT-синоним типа int
INT x, y;
typedef unsigned size_t;
size_t x, y; //переменная типа unsigned
typedef char string[225];
string array; //char array[225];
1. Функция typedef даёт имена типам данных.
2. Выполняется компилятором.
3. Более гибка, чем #define.
Испоьзование типа real вместо float:
typedef float real;
real x, y[5], *px;
если определение расположено внутри функции, то область действия локальна, вне функции глобальна.
typedef char* STRING //STRING-идинтификатор указателя на тип char.
STRING name, sign; //char*name,*sign;
Существуют 3 вида именнованных констант:
- имя любого массива или функции;
- имена членов перечисления;
- любое имя любого типа, в определении которого присутствует модификатор const.
const i = 5;
const char *ip = &i;
Поскольку модификация такого объекта-константы запрещена, он должен быть инициализирован.
const int *ip; //константой является объект, на который указывает указатель;
int* const ip; //сам указатель является константой
const char *pc = "Это строка";
pc[2] = 'a'; //ошибка
pc = "Это другая строка"; //верно
char* const pc = "Это строка";
pc[2] = 'a'; //верно
pc = "Это другая строка"; //ошибка
Использование const предпочтительнее по сравнению с #define, так как использование константы контролирует компилятор.