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