Глава 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)