The following code illustrates these subtleties: void Foo( int * ptr, int const * ptrToConst, int * const constPtr, int const * const constPtrToConst ) { *ptr = 0; // OK: modifies the "pointee" data ptr = NULL; // OK: modifies the pointer *ptrToConst = 0; // Error!
Эти тонкости иллюстрирует следующий код: void Foo ( int * ptr, int const * ptrToConst, int * const constPtr, int const * const constPtrToConst) { *ptr = 0; //Порядок: меняет данные по указателю. ptr = NULL; //Порядок: меняет указатель. *ptrToConst = 0; //Ошибка!