БлогNot. C++: миф о "передаче массива по значению"

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++ :(


теги: c++ ошибка

показать комментарии (1)

06.11.2013, 19:52; рейтинг: 12347