Передать указатель по ссылке - PullRequest
0 голосов
/ 13 ноября 2018

При попытке этого руководства HackerRank (в котором вам нужно установить a в a + b и b в | a-b |), я сначала попытался изменить указатели, чтобы они указывали на новые значения:

void update(int *a,int *b) {
    // Complete this function
    int sum = *a + *b;
    int diff = *a - *b;
    if (diff < 0) diff = -diff;
    a = &sum; //these do not work, because a and b are passed by value
    b = &diff;
}

Это не работает - обратно в main, a и b указывают на их исходные значения - потому что (или я так понимаю) указатели a и b передаются в update () по значению. Нет проблем, подумал я, я просто изменю сигнатуру функции, чтобы передать указатели по ссылке:

void update(int *&a,int *&b) {

К сожалению, это тоже не работает, но я в недоумении, почему. Может кто-нибудь объяснить, почему эти указатели, которые, по-видимому, передаются по ссылке, не обновляются за пределами области действия функции?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

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

Я подозреваю, что вы действительно должны сделать это

*a = sum;
*b = diff;

Затем при вызове функции используйте оператор адреса & для передачи указателей на обычные int переменные:

int sum, diff;
update(&sum, &diff);

Если вы идете с передачей ссылок на указателии, например,

a = &sum;

, тогда вы сделаете a указанием на локальную переменную.Локальная переменная, которая (в некотором смысле) перестанет существовать, когда функция вернется.Это означает, что указатель будет недействительным, и разыменование приведет к неопределенному поведению .

И если вам не нужно поддерживать совместимость с C, то в C ++ используйте толькофактические ссылки вместо эмуляции через указатели:

void update(int& a,int& b) {
    ...
    a = sum;
    b = diff;
}

и назовите его как

int sum, diff;
update(sum, diff);
0 голосов
/ 13 ноября 2018

Вы назначаете адреса локальных переменных (sum, diff, которые выходят из области действия после выхода из функции) для a и b.Это неопределенное поведение для доступа к этим адресам в main.Вместо этого вы можете назначить их значения.

*a = sum; 
*b = diff;
...