Распределение памяти
Объединения
Битовые поля структур (bit-fields)
Использование в качестве члена указателя на ту же структуру
struct mystruct {
int a;
int b;
mystruct *p;
}
Используется для построения связных списков
12 Объявление переменных типа структур в С и С++
Объявление структуры одинаково для С и С++
struct mystruct {
int a;
int b;
}
Задание структурных переменных | |
C | C++ |
struct mystruct prim | mystruct prim |
Ключевое слово struct - обязательно | Ключевое слово struct - отсутствует |
Назначение битовых полей |
1. Для хранения нескольких логических переменных в одном байте, что экономит память |
2. Для приема информации внешних устройств, закодированных в битах |
3. Для подпрограмм кодирования, которым требуется доступ к отдельному биту в рамках байта |
a) Общий формат определения битовых полей
struct имя_типа_структуры {
тип имя1:длина;
тип имя2:длина;
. . .
тип имяN:длина;
} имена_структурных_переменных;
Длина структуры всегда кратна 8 Тип поля обычно unsigned |
б) Пример структуры, содержащей одно битовое поле
struct onebit{
unsigned field1:1;
} inform;
в) Пример структуры, определяющей состояние порта
struct status {
unsigned field1:1;
unsigned field2:1;
unsigned field3:1;
unsigned field4:1;
unsigned field5:1;
unsigned field6:1;
unsigned field7:1;
unsigned field8:1;
}inform1;
г) В структуре можно пропускать поля
struct status1 {
unsigned:5; // пять битов не интересуют; имя поля можно не
//использовать
unsigned field6:1;
unsigned field7:1;// последний бит не интересует, поэтому поле не
//определяется
}inform2;
Обращение к полю:
inform2.field6=0;
д) В структуре можно смешивать “обычные” члены с битовыми полями
struct stud1 {
AnsiString name;
int grup; // номер группы
addr address; // в качестве члена структуры используется вложенная
// структура
unsigned work:1; // признак вечернее отделение или дневное
}student; // переменная типа stud
· Объединение состоит из нескольких переменных, которые разделяют одну и ту же область памяти · Объявление объединения начинается с ключевого слова union · При объявлении объединения компилятор автоматически выделяет область памяти, достаточную для хранения в объединении переменных самого большого по объему типа |
union myunion { // объявление объединения не задает переменной и
short int i; // не выделяет памяти
char ch;
}u_var; // имя переменной (память выделяется)
Переменная | Число байт |
i | |
ch |
сh
i
Обращение к элементу объединения:
u_var.ch=’N’;
Для объединений разрешена операция ->, если обращение к объединению производится с помощью указателя.