C++.Бархатный путь


Массив и константный указатель


Несмотря на некоторое сходство с константным указателем, массив является особым типом данных. В этом разделе мы рассмотрим основные отличия массива и константного указателя.

Прежде всего, рассмотрим варианты инициализации указателя:

char * const pcchVal_1 = chArray_2; char * const pcchVal_2 = new char[5]; char * const pcchVal_3 = (char *) malloc(5*sizeof(char));

Для инициализации последнего константного указателя был использован вызов функции malloc().

Каждый из этих операторов демонстрирует один из трёх возможных способов инициализации константного указателя: непосредственное присвоение значения, использование операции new, вызов функции. Операция new и функции распределения памяти, выделяют соответствующие участки памяти и возвращают начальный адрес выделенной области памяти. Ни один из этих способов не подходит для инициализации массива.

В свою очередь, при определении константных указателей не используются уже известные инициализаторы массивов с явным указанием размерности и списком инициализаторов.

Определим массив и константный указатель на область памяти:

int intArray[5]= {11,22,33,44,55}; int * const pciVal = new int[5];

К константным указателям и массивам применимы одни и те же методы навигации, связанные с использованием операции индексации:

intArray[-25] = 10; *(intArray + 25) = 10; pciVal[2] = 100; *(pciVal + 5) = 100;

А теперь применим операцию sizeof по отношению к проинициализированным указателям: cout << "pciVal:"<< sizeof(pciVal)<< " intArray:"<< sizeof(intArray);

Для Borland C++ 4.5, операция sizeof покажет размер области памяти, занимаемой указателем (4 байта) и размер массива (размер элемента * размерность массива)==(10 байт). Операция sizeof различает указатели и имена массивов.

Кроме того, следующий тест также даёт различные результаты.

if (intArray == &intArray) cout << "Yes, массив." << endl; else cout << "No, массив." << endl; if (pciVal == &pciVal) cout << "Yes, указатель. " << endl; else cout << "No, указатель." << endl;




- Начало -  - Назад -  - Вперед -