Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1
Кент Рейсдорф. BORLAND C++BUILDER. Страница 58
Обратите внимание, что я должен создавать новый экземпляр структуры отдельно для каждого элемента массива. Для доступа к членам структур используется оператор косвенного доступа в сочетании с индексным оператором.
^Неинициализированные: указатели содержат случайные значения, так же, как и любые другие неинициализированные переменные.- Попытка использовать неинициализированный указатель может: привести к хаосу в программе. Во многих случаях указатели инициализируются одновременно с их объявлением:
MyArray* array ~ new MyArray;
Иногда, однако, вам нужно будет объявить: указатель : и инициализировать еШэ где-то далее по ходу программы. Если вы попытаетесь использовать этот указатель до инициализации, он будет содержать адрес некоторого случайного места в памяти, изменение которого может привести к непредсказуемым проблемам. Зачастую изменение памяти не проявляется ■ немедленно, порождая как бы случайные сбои. Для безопасности вам следует при объявлении инициализировать указатель нулевым значением:
MyArray* array = 0;
При попытке использовать NULL-указатель (это может быть любой указатель, установленный в 0, или NULL), Windows немедленно выдаст сообщение о ■ нарушении прав доступа или общем нарушении защиты. Это не самое приятное, что можно ожидать, но несомненно меньшее из двух зол. Гораздо лучше сразу получить сообщение об ошибке, чем столкнуться затем с проблемами непонят- - ного происхождения.
Необходимость разыменования, то есть получения содержимого памяти, на которое ссылается указатель, возникает довольно часто. Рассмотрим следующий пример:
Могу представить, в каком вы сейчас недоумении. Однако все не так уж сложно. В первой строке этого примера объявлена переменная х типа int и ей присвоено значение 20. В следующей строке объявлен указатель на int, которому присвоен адрес переменной х. Это сделано с помощью оператора взятия адреса (&). В данном примере этот оператор сообщает компилятору, что нужно взять адрес переменной х, а не ее значение. После присваивания ptrx содержит адрес, по которому расположена в памяти переменная х. Далее по ходу программы нам нужно получить значение объекта, на который указывает ptrx. Вы могли попробовать сделать так: