Указатели


Перечисления

 

Перечисления (enumerated) – это тип данных, заданный списком принадлежащих ему значений, выраженных символическими именами и представляющих целочисленные константы.

Формат описания перечисления имеет вид:

enum <имя_перечислимого_типа>

{

<Список_значений>

};

 

Например.

enum spectrum {red, orange, yellow, green, blue, violet};enum spectrum color;

 

Здесь, spectrum можно использовать в качестве имени типа, а color переменная этого типа. Идентификаторы, заключенные в фигурные скобки, перечисляют возможные значения, которые может принимать переменная spectrum. Соответственно, возможными значениями color являются red, orange, yellow и т. д. Все эти возможные значения являются целочисленными, т.е. 0, 1, 2, 3, 4, 5. Другими словами, значения в перечислении (enum) начинаются с 0, и всегда увеличиваются на 1.

Замечание.

1) Назначение перечислимых типов заключается в том, чтобы повысить удобочитаемость программы.

2) К перечисляемой переменной color можно применять операции инкрементирования "++" и декрементирования "– –". Например,

 

printf(“Значения переменной color:\n”);

for (color = red; color <= violet; color++){ printf (“%4d”,color);};

Здесь, на экран после фразы Значения переменной color: с новой строки будут выведены числа 0, 1, 2, 3, 4, 5.

3) Можно изменить присвоенные по умолчанию значения перечисления (0, 1, 2 и т. д.). Например:

enum levels {low = 100, medium = 500, high = 2000};

enum feline {cat, dog = 10, ponny, tiger};

В этом случае cat (кошка) получает значение 0 по умолчанию, dog (собака), ponny (пони), tiger (тигр), соответственно, получают значения 10, 11, 12, т.к. если назначить конкретное значение одной из констант, то все следующие константы будут пронумерованы последовательно в возрастающем порядке.

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

Формат описания указателя на объект имеет вид:

 

<тип> *<имя_типа>;

 

где <тип> - любой скалярный тип и некоторые структурированные (массивы, структуры, объединения, перечисления), кроме ссылки (&) и битового поля. При этом <тип> может быть объявлен, или не определен, т.е. в структуре, например, может присутствовать указатель на структуру того же типа (используется в стеках, списках, очередях).

Звездочка относится непосредственно к <имени_типа>, т.е. перед именем динамической переменной необходимо ставить (*).

Например, в операторе

int *a, b, *c;

описываются два указателя на целое с именами а и с, а также целая переменная b.

Указатели чаще всего используют при работе с динамической памятью, называемой «кучей» (перевод с английского языка слова heap). Это свободная память, в которой можно во время выполнения программы выделять место под объекты в соответствии с потребностями. Доступ к выделенным участкам динамической памяти, называемыми динамическими переменными, производится только через указатели. Время жизни динамических переменных — от точки создания до конца программы или до явного освобождения памяти. В C++ используется два способа работы с динамической памятью. Первый использует семейство функций malloc и достался в наследство от С, второй использует операции new и delete.

При работе с указателями необходимо выполнить его инициализацию, то есть присвоение начального значения. Использование неинициализированных указателей приводит к ошибкам в программах. Инициализатор записывается после имени указателя либо в круглых скобках, либо после знака равенства.