Глава 7. Указатели и ссылки__________________________________757

Одним именем NULL для всех типов данных не обойтись, поскольку требуется слишком много имен. Константа NULL определена в С как

#define NULL (void*)0

т. е. целое число 0 приведено к пустому указателю void*. В C++ это работать не будет, поэтому вам придется приводить NULL к каждому типу указателей, уродуя собственный код. Вот несколько примеров корявого кода при использовании NULL в старом стиле С:

char *p = (char*)NULL;

int *pint = (int*)NULL;

Единственным решением является использование постоянного целочисленного значения, когда нужен NULL. Как правило, для постоянных значений желательно вводить мнемонические обозначения, поскольку это улучшает читабельность кода. Использование 0 вместо NULL — исключение.

*

Операция массива

В некоторых отношениях операция массива ([ ]) и операция разыменования взаимозаменяемы. В Borland C++ первый элемент массива и элемент, возвращаемый при разыменовании указателя — это один и тот же элемент. То есть определение а как указателя на массив целых чисел

int *a = new int[5];

означает, что *а или а[0] возвращают первый элемент массива. Операция разыменования часто используется при передаче статического или динамического массива в качестве аргумента функции.

! Предупреждение

Взаимозаменяемость операций * и [] в Borland C++ не гарантирует переносимости на другие платформы. Если вы создаете программу, для которой необходимость в переносе под другие операционные системы будет актуальна, обращайтесь к нынешнему стандарту C++ или руководству Annotated Reference Manual.

Чтобы это продемонстрировать, объявим функцию Foo, которой передается целочисленный массив:

void Foo( int *array, unsigned int size);

Тогда переменные, соответствующие этому объявлению, могут принимать . одну из форм:

int buffy[10]; // статическое размещение Foo(buffy, 10)