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

48. Битовые поля

Битовые поля – это особый вид полей структуры. Они используются для плотной упаковки данных, например, флажков типа «да/нет». Минимальная адресуемая ячейка памяти – 1 байт (8 бит), а для хранения флажка достаточно одного бита. При описании битового поля после имени через двоеточие указывается длина поля в битах. Битовые поля могут быть любого целого типа и обычно используется тип unsigned int (сокращенно unsigned) . Например:

struct options //если не использовать битовые поля, то

{ //структурная переменная займет 4 байта:

unsigned bold : 1; // char bold;

unsigned italic : 1; // char italic;

unsigned underline : 1; // char underline;

unsigned background : 4; // char background;

} opt;

Под переменную opt структурного типа options будет отведена память размером 1 байт.

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

49. Объединения в языке с

Объединение представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как и у структуры, только вместо ключевого слова struct используется слово union. Длина объединения равна наибольшей из длин его полей. В каждый момент времени объединение хранит только одно значение, и ответственность за его правильное использование лежит на программисте.

Объединения применяют для экономии памяти в тех случаях, когда известно, что больше одного поля одновременно не требуется. Пример:

#include <stdio.h>

void main()

{

int payType; //тип платежа

union payment

{

char card[25]; //оплата по карте

int check; //оплата чеком

} info;

// . . . присваивание значений переменным payType и info

switch (payType)

{

case 0: printf("Оплата по карте: %s", info.card); break;

case 1: printf("Оплата чеком: %d", info.check); break;

}

}

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

50. Переименование типов в языке с

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

typedef Тип НовоеИмяТипа[Размерность];

Размерность может отсутствовать. Примеры:

typedef unsigned int uint;

typedef char message[100];

typedef char *string;

typedef struct

{

char fio[30];

int tabNumber;

double salary;

} worker;

Введенные таким образом имена можно использовать таким же образом, как и имена простых типов данных:

uint i, j; //две переменные типа unsigned int

message str[10]; //массив из 10 строк по 100 символов в каждой строке

string p = str; //инициализированный указатель на char

worker staff[100]; //массив из 100 структур

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