Подтвердить что ты не робот

Массивы по умолчанию переданы по ссылке?

Я читаю книгу на С++, в которой говорится:

С++ передает массивы в функции по ссылке - вызываемые функции могут изменять значения элементов в исходных массивах вызывающих.

Это относится к таким ситуациям:

int hourlyTemperatures[ 24 ]; 
modifyArray( hourlyTemperatures, 24 );

Однако, это ванильные указатели массива C на работе здесь, правильно? Не используется методика С++ "reference", то, что передается, является указателем по значению, в данном случае - указателем на первый элемент массива. Конечным результатом является то, что функция действительно имеет доступ к полному исходному массиву, как ссылку, но это фактически не проходит по ссылке, правильно?

Из этой книги Prentice Hall: The book in question

4b9b3361

Ответ 1

Ты прав. Формулировка очень сбивает с толку и использует значение "ссылки", которое не совпадает с термином reference, относящимся к функции С++ с тем же именем. Вместо этого он говорит о том, как разрушаются имена массивов указателям — на самом деле вы не "передаете массив", как это вообще!

В "старинные дни" "ссылка" использовалась в более общем смысле так же, как "handle" — абстрактный термин для представления использования косвенности для поддельной по-ссылочной семантике на языках, которые ее не поддерживали. Но С++ поддерживает то, что он называет ссылками; таким образом, мы склонны не использовать "ссылку" в своем "ручном" смысле, когда говорим о С++ (где Deitel ∉ "мы", очевидно).

Рекомендуемое чтение:

Любая другая книга на С++ очень осторожна! Хотя в большинстве областей жизни мне было бы сумасшедшим предположить, что включение в вышеупомянутые два конкретных списка является окончательной предпосылкой для того, чтобы книга считалась "хорошей", существует достаточное количество опасно неправильного текста на С++ (например, текст, который вы цитируете), и это достаточно большая проблема для наших новичков языка, которые в мире книг на С++ действительно являются хорошим правилом.

Ответ 2

Верно, что когда вы передаете массив функции, которую вы фактически передаете указателю по значению. Тем не менее, я чувствую, что для людей, просто изучающих С++, им не нужно беспокоиться о указателях вообще. Они узнают, что вы можете передать переменную по значению или по ссылке на функцию.

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

Посредством ссылки означает, что если функция изменяет значение переменной, то эти изменения будут видны в исходной функции вызова.

Когда массив является параметром функции (без ключевого слова const), любые изменения, внесенные в значения в массиве, будут видны в исходной функции вызова. Поэтому мы говорим, что по умолчанию массивы передаются по ссылке. Это позволяет избежать объяснения того, какие указатели действительно не подходят для передачи статически объявленных массивов, но это позволяет людям понять, что если они будут бесполезны со значениями в массиве в вызываемой функции, эти изменения будут сохраняться в вызывающей функции.

Я преподаю курс первого курса "Компьютерная наука С++" в первоклассной инженерной школе (наша команда разработчиков собирается в этом году в Мировом финале в России). Около 90% людей в классе не являются специалистами в области компьютерных технологий (в основном механиками). Вышеуказанный материал более чем достаточно, чтобы смутить их, не объясняя, что такое указатели. Вот почему в этой книге и других упоминается, что массивы передаются по ссылке, потому что многим людям, читающим книги, просто нужно "достаточно" С++, чтобы получить их, не изучая каждую мелочь. Те, которые действительно хотят запрограммировать, не должны иметь проблем с переходом к факту, что массивы действительно передаются указателем.

Просто мое мнение.

Ответ 3

Подводя итог моему комментарию, вы абсолютно правы!

Книга неверна в выборе жаргона. Он пытается говорить о массивах, разлагающихся на C-указатели. Он ссылается на , передавая этот указатель по значению как по ссылке, которая НЕПРАВИЛЬНАЯ.

Это достаточно распространенное заблуждение, я считаю, что меня тоже научили этому (передавая указатель как value ==, проходящее по ссылке). Это совершенно неправильно с точки зрения ссылок на С++ и передается по ссылке.

Если бы это было правильно, Я бы не смог это сделать.

void ModifyMyArray(int *array){
   int oops[4]= {0};
   array = oops;

   array[2] = 1;
}
...
int MyArray[4] = {1,3,5,7};

ModifyMyArray(MyArray);

Подобно этому вопросу в Java - Является ли Java "pass-by-reference " или" пропуск по значению",