2016-12-07 2 views
0

У меня есть функция сказать аннулируются theFunc (интермедиат Num &, Int * массив), который принимает в качестве межд по ссылке и указатель массиваПередача стека выделяется аргумент по ссылке на массив

theFunc(int num&, int* array) 
{ array[0] = num; 
} 

это просто пример, так что функция делает что-то простое

int main() 
{ int k = 3; 
    int* theArray = new int[5]; 
    theFunc(k, theArray); 

delete[] theArray; 
return(0); 
} 

Мой вопрос заключается в том, как это к, стек выделяется ИНТ экземпляр, передаваемый по ссылке на theFunc и хранится в динамически хранится массив. Я знаю, что объекты/аргумент не могут просто перемещаться между стеком и кучей, потому что у них есть определенные сохраненные адреса памяти. Я хочу понять, почему это работает, и что происходит под капотом (также, если есть разница в этом случае от передачи по значению).

Спасибо!

+2

Переменные стека имеют адрес памяти. Адрес просто передается функции так же, как и адрес кучи. –

+0

Другим ключевым моментом является то, что _value_ of 'k' _copied_ в' array [0] ' – qxz

+0

' int num & 'является синтаксической ошибкой. Также 'theFunc' должен иметь тип возврата. Пожалуйста, внесите реальный код –

ответ

1

Короткий ответ заключается в том, что k не «хранится» в динамически распределенном массиве. Скорее, когда вы пишете int *theArray = new int[5], вы выделяете блок памяти, который может содержать массив из пяти целых чисел. На самом деле это уже делает, удерживая пять целых чисел: ничего не делая, theArray[0] является допустимым выражением, т. Е. Является целым числом, хотя его значение может быть -32,768 или что-то в этом роде. Когда вы звоните theFunc со ссылкой на k, вы меняете значение theArray[0] на k на назначение копирования, поэтому вы назначаете значение k первому элементу массива. Вы не храните ничего нового, вы просто меняете ценность того, что уже было сохранено.

Действительно, в данном конкретном случае ничего не происходит или не теряется путем прохождения num по ссылке. Наблюдаемое поведение функции как написанное было бы идентичным, если бы оно передавалось по значению.

0

Ваша переменная K существует в стеке, которое представляет собой всего лишь кусок памяти, который использует программа. Поэтому каждая запись в стеке по-прежнему существует как адресная ячейка памяти.

Когда вы вызываете theFunc, этот адрес K вставляется в стек вызовов и выгружается в Func. Когда вы выполняете присвоение местоположению массива, значение num (или K), то есть значение по адресу, которое было передано, копируется в массив.

В этом случае передача по значению будет иметь тот же эффект, поскольку Func не меняет num (или K).

Смежные вопросы