Динамический массив как параметр функции
Для добавления элемента в динамический массив увидел такой синтаксис:
void push_back(int*& arr, int &size, int val)
{
int* newArr = new int[size + 1];
for (int i = 0; i < size; i++)
{
newArr[i] = arr[i];
}
newArr[size] = val;
size++;
delete[] arr;
arr = newArr;
}
Вопрос касается передачи самого массива в качестве параметра, автор видео использует указатель на ссылку *&, почему не работает передача массива по указателю?
Не могу понять что именно происходит при передаче указателя на ссылку, разве при передаче по указателю мы не можем так же заменить адрес на который указывает указатель?
Ответы (1 шт):
Ключевой момент здесь в последней строчке:
arr = newArr;
Здесь переменной arr присваивается значение нового указателя, а arr - это параметр функции, который передается по ссылке. Поэтому значение переменной arr (то есть самого указателя, адреса на участок памяти) изменится и в вызывающем коде тоже.
Этот код делает следующее:
- Выделяет память под новый массив, размер которого на единицу больше исходного;
- Копирует исходный массив в новый;
- Дописывает в конец нового массива добавляемое значение;
- Удаляет исходный массив;
- Заменяет указатель на исходный массив указателем на новый массив. Замена отработает и в вызывающем коде тоже, так как указатель передан по ссылке.
разве при передаче по указателю мы не можем так же заменить адрес на который указывает указатель?
Нет, не можем. При передаче по указателю мы можем изменить тот участок памяти, на который этот указатель указывает, но не сам указатель (адрес). Замену самого адреса можно провести либо с помощью передачи указателя по ссылке (как в вашем примере), либо при передаче указателя по указателю: int **arr. Во втором случае при замене адреса его нужно будет разыменовывать:
*arr = newArr;