756_______________________________Часть II. Программирование на C++
! Предупреждение
Указатели в C++ не инициализируются автоматически, что означает, что вы сами должны задавать указателю начальное значение. Забывать об этом опасно: обращение к неинициализированному указателю приводит к непредсказуемому результату. (Вообще-то этот результат с хорошей долей вероятности можно предсказать — сбой программы и операционной системы).
Указатели используются не только для обращения к блокам памяти, выделенным с помощью операции new. Они также нужны для доступа к элементам с конкретным физическим местоположением. Это могут быть адреса слов состояний аппаратных компонентов или адреса неких объектов, создаваемых во время выполнения программы.
Начальные значения указателей. Присваивание указателям начальных значений почти всегда лежит на совести программистов. Есть два типа значений, которые можно присвоить указателю. Первый — это. адрес области памяти, а второй — это 0 (заметьте, 0, а не NULL).
Здесь самое время немного порассуждать. Значение указателя не определено до тех пор, пока вы сами его не присвоите. Если вы забудете дать указателю начальное значение, то у вас не будет надежного способа сравнить его состояние с начальным. Если вы не сможете удостовериться в корректности указателя сравнением его с некоторым начальным значением, вы не сможете отличить хороший указатель от плохого. Кроме этого, поскольку указатели часто инициализируются операцией new, за которой обязательно должна следовать операция delete, есть опасность применить delete к указателю, указывающему на какой-нибудь неизвестный, но нужный адрес. Для нулевого указателя это не страшно; операция delete сравнивает значение указателя с нулем и аккуратно обрабатывает эту ситуацию.
Присваивание начального значения означает, что при определении указателя ему следует присвоить либо адрес объекта, либо адрес конкретного места в памяти, либо число 0. Примеры каждого типа инициализации выглядят примерно так:
char *kybdBios = (char *)0х00000417; // положение в памяти
int *intArray == new int [10]; // 10 целых чисел
char *p = 0; // инициализация нулем.
Инициализация указателя нулем. Обратите внимание, что для инициализации нулем не используется мнемоническое обозначение или символическая константа NULL. Ввиду строгой типизированности языка C++ возникают сложности с определением, к какому типу данных должна принадлежать константа NULL. Типы данных должны точно соответствовать, поэтому определить NULL как константу в лучшем случае проблематично, потому что одного типа данных для этого явно недостаточно.