Здравствуйте,есть один вопрос: есть вот такая функция - void insert_elems(long *&L , int &n , long x);
Кое-что мне здесь непонятно,а именно первый аргумент функции - long *&L
Правильно ли я понимаю , что это указатель на тип long , который передаётся по ссылке ?
Если да,тогда у меня другой вопрос.Я всегда думал , что при передаче указателя в функцию он будет передаваться по ссылке,а не по значению.
Тогда зачем знак & ? Для n ещё понятно зачем он. Просто даже когда писал простенькие функции с массивами(к примеру которые прибавляют 1 к каждому элементу массива) , исходный массив который я передавал(без &) также изменялся(что происходит как при передаче по ссылке).
Если необходимо описание самой функции,то вот оно :

Код
Заранее спасибо.

@темы: C++

Комментарии
25.10.2010 в 17:05

Don't stop the music.
nvse
Правильно ли я понимаю , что это указатель на тип long , который передаётся по ссылке ?
Да.

Тогда зачем знак & ?
Амперсанд в long* &L нужен для того чтобы изменив значение переменной L (указатель - переменная содержащая адрес переменной определённого типа), оно изменилось бы в main-е. То есть при присваивании L = (long*) realloc(L, (n + 1) * sizeof(long)), L получает значение справа и это значение будет изменено в main-е.

Почему это так:
Параметр в языке C++ передаётся в функцию по значению если не написать &. По значению - означает происходит копирование его значения. В данном случае скопировалось значение L. Если например изначально L = 20 (где 20 - это адрес ячейки) то 20 скопируется в insert_elems и если мы не поставим амперсанд то L получит адрес который вернула realloc(), но он не изменится в main.

Замечания:
Обойтись без амперсанда можно передав адрес переменной L, то есть адрес переменной в которой адрес переменной типа long. На языке C это пишется как long** L. И тогда мы передаём например число 11 которое тоже передаётся по значению но 11 это это адрес long*, значит доступаясь до ячейки по адресу 11 мы поменяем её содержимое.

исходный массив который я передавал(без &) также изменялся
Исходный массив (а точнее значения его ячеек) менялся потому что вы передавали адрес 1-й ячейки массива по которому при помощи оператора [] функция доступалась до её содержимого и его меняла.

То есть:
a[i] фактически идентично *(a + i).
28.10.2010 в 20:14

Ага,понятно.То есть мой исходный массив изменялся,потому как я просто копировал адрес нулевого элемента массива,а потом когда проделывал операции с элементами с помощью оператора [] он имел тот же адрес , и поэтому изменения переносились и на исходный массив ?А realloc получается ,что устаналивает указатель уже на другой адрес выделенного блока памяти и потому наш массив имеет другой адрес по сравнению со своим исходным?Ещё рах спасибо.