C++: миф о "передаче массива по значению"
В продолжение темы и во избежание заблуждений (не буду позорить заблужденца ссылкой :), процитируем хорошего автора (курсив мой):
Шилдт, "Полный справочник по C"
В языке С нельзя передать весь массив как аргумент функции (передать "по значению"). Однако можно передать указатель на массив, т.е., имя массива без индекса. Например, в представленной программе в func1()
передается указатель на массив i
:
int main(void) { int i[10]; func1(i); /*...*/ }
Добавлю от себя, что в этом случае узнать размерность массива i
изнутри func1()
- проблема самой func1()
:) Эта размерность нигде не хранится.
Если в функцию передается указатель на одномерный массив, то в самой функции его можно объявить одним из трех вариантов: как указатель, как массив определеного размера и как массив без определенного размера. Например, что бы функция func1()
получила доступ к значениям, хранящимся в массиве i
, она может быть объявлена как
void func1(int *x)/* указатель */ { /*...*/ }
или как
void func1(int x[10]) /* массив определенного размера*/ { /*...*/ }
или как
void func1(int x[]) /* массив без определенного размера */ { /*...*/ }
Эти три объявления тождественны, потому что каждое сообщает компилятору одно и то же: в функцию будет передан указатель на переменную целого типа. Как правило длина массива не имеет для функции никакого значения, потому что в С не выполняется проверка границ массива.
И ещё:
char p[10];
Следующие два выражения идентичны:
p &p[0]
Выражение
p==&p[0]
принимает значение "истина" (не ноль), поскольку адрес первого элемента - это то же самое, что и адрес массива.
Меж тем, бредовые утверждения о "копировании массива при передаче его в функцию" встречались мне даже в учебной литературе по C/C++ :(
06.11.2013, 19:52 [13393 просмотра]