Указатели
Перечисления
Перечисления (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.
При работе с указателями необходимо выполнить его инициализацию, то есть присвоение начального значения. Использование неинициализированных указателей приводит к ошибкам в программах. Инициализатор записывается после имени указателя либо в круглых скобках, либо после знака равенства.