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


Массивы и параметры


В C++ возможно лишь поэлементное копирование массивов. Этим объясняется то обстоятельство, что в списке объявлений параметров не объявляются параметры-массивы. В Borland С++ 4.5 транслятор спокойно реагирует на объявление одномерного массива в заголовке функции, проверяет корректность его объявления (размеры массива должны быть представлены константными выражениями), однако сразу же игнорирует эту информацию. Объявление одномерного массива-параметра преобразуется к объявлению указателя. Подтверждением этому служит тот факт, что "массив"-параметр невозможно проинициализировать списком значений, что совершенно нормально для обычных массивов: void ff(int keyArr[ ] = {0,1,2,3,4,5,6,7,8,9});// Ошибка объявления. void ff(int keyArr[10] = {0,1,2,3,4,5,6,7,8,9});// Ошибка объявления.

Оба варианта прототипа функции будут отвергнуты. При этом транслятор утверждает, что указателю (и это несмотря на явное указание размеров массива!) можно присваивать значение адреса, либо NULL. int keyArr[100]; // Глобальный массив. int xArr[5]; // Ещё один глобальный массив. int XXX; // Простая переменная. void ff(int keyArr[ 1] = keyArr, //Объявление одноименного параметра. int pArr1 [10] = xArr, int pArr2 [ ] = &XXX, // Адрес глобальной переменной. int pArr3 [ ] = &xArr[10], //Адрес несуществующего элемента. int pArr4 [50] = NULL); /* Допустимые способы инициализации массивов в прототипе функции свидетельствуют о том, что здесь мы имеем дело с указателями. */

Следующий пример подтверждает тот факт, что объявление одномерного массива в списке параметров оказывается на самом деле объявлением указателя. #include <iostream.h> void fun(int *, int[], int qwe[10] = NULL); /* Все три объявления параметров на самом деле являются объявлениями указателей. */ void main() { int Arr[10] = {0,1,2,3,4,5,6,7,8,9}; int *pArr = Arr; /* В функции main определены массив и указатель.*/ cout << Arr << " " << &Arr << " " << &Arr[0] << endl; cout << pArr << " " << &pArr << " " << &pArr[0] << endl; /* Разница между массивом и указателем очевидна: значение выражения, представленного именем массива, собственный адрес массива и адрес первого элемента массива совпадают. */ fun(Arr, Arr, Arr); } void fun(int* pArr1, int pArr2[], int pArr3[100]) { cout << sizeof(pArr1) << endl; cout << sizeof(pArr2) << endl; cout << sizeof(pArr3) << endl; cout << pArr1 << " " << &pArr1 << " " << &pArr1[0] << endl; cout << pArr2 << " " << &pArr2 << " " << &pArr2[0] << endl; cout << pArr3 << " " << &pArr3 << " " << &pArr3[0] << endl; /* Все параметры проявляют свойства указателей. */ }




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