Программирование >>  Элементы языков с и с++ 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 200


Таблица 7.1 (окончание)

СТРУКТУРА

w2: слово

в динамической

памяти

(w 2 < wl)

Указатель на слово w2

Количество слов w2: 1

w3: слово

в динамической

памяти

(w 3 > wl)

Указатель на слово w3

Количество слов w3: 1


Рис. 7.11. Логическая структура дерева, построенного программой листинга 7.10

эитовые поля в структурах

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

struct

unsigned namel: sizel; unsigned naine2: size2;

имя поля и его размер имя поля и его размер

unsigned патеК: sizeK; }flags;

имя поля и его размер

Это обычное задание шаблона и на нем экземпляра структуры.

13)к960



152 Гпаеа 7

Размер - это количество битов, расположенных подряд. Сумма всех полей не должна выходить за пределы размера переменной типа int. Если же зто случится, то первое битовое поле, превысившее размер переменной int, расположится в следующем участке памяти, .отведенном для переменной типа

int.

Пример:

struct

unsigned nl: 1; имя поля и его размер unsigned п2: 2; имя поля и его размер }flags;

Здесь определен экземпляр структуры - переменная flags, содержащая два битовых поля: одно - однобитовое, другое - двухбитовое. На поля можно ссылаться как на отдельные члены структуры: flags.ni, flags.n2. Эти паля ведут себя подобно целым без знака и могут участвовать в арифметических операциях, применяемых к целым без знака. Например, для определенных выше полей можно записать:

flags.п1=1

flags.nl=0

flags.n2=3i в двоичной).

включен бит выключен бит

включены биты 1,2 поля (3 в десятичной системе равно 11

Для проверки значения битов можно писать: if(flags.п2==1 && flags.nl==0) ...

Категории памяти

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

Глобальные (их еще называют статическими) переменные живут , пока работает ваша программа. Все функции относятся к глобальным переменным.



Работа с указателями и структурами данных 153

Язык С, кроме того, имеет ряд спецификаторов категорий памяти, которые явно указывают на это компилятору. Мы уже встречались с некоторыми из них: это спецификаторы extern и static Первый применяется при определении так называемых внешних переменных (они определяются вне вашей программы, например, в подключаемом к ней h-файле). Внешние переменные тоже являются глобальными. Второй спецификатор позволяет глобали-зовать локальную переменную: при выходе из локализующей ее конструкции такая переменная не теряет своего значения, как не теряет его она и при Ечоде в свою конструкцию. К другим спецификаторам категории памяти относятся спецификаторы: auto, register, typedef.

В объявлении переменной вы можете использовать только один спецификатор категории памяти. Если категория памяти в объявлении переменной не указана, то категория принимается равной auto и объявление переменной внутри блока, функции или оператора создает автоматические переменные. Переменные, объявленные с категорией register будут также отнесены к автоматическим (т. е. локальным). Переменные, объявленные с категориями static или extern, будут отнесены к глобальным.

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

Спецификатор typedef фактически вводит синоним типа, давая возможность программисту вводить типы данных с подходящими ему наименованиями, чтобы улучшить читаемость программы. Вот структура его спецификации:

typedef [заменяемые типы: void, char, short, int, long, float, double, signed, unsigned, struct, enum] новое имя;

Например:

typedef char Flag;

Здесь тип char заменен синонимом Flag. Теперь в вашей программе можно вместо char везде писать Flag. Например, Flag b=b; Если же вы используете имя переменной, совпадающее с синонимом, определенным по typedef, такая переменная, как обычно, должна иметь тип данного. Например: int Flag=12;.

Другой пример: typedef struct club



1 ... 47 48 49 [ 50 ] 51 52 53 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика