Передача указателей по ссылке против передачи указателей в функции - PullRequest
0 голосов
/ 26 апреля 2019

Прошло много времени с тех пор, как я что-то кодировал на C ++. Когда я пытался помочь другому человеку в качестве преподавателя CIS, он хотел знать, почему необходимо иметь знак амперсанда рядом с указателем на int.

Я подумал, что если вы передадите указатель по ссылке и укажете на что-то еще, после того, как вы передадите, main узнает, что val будет равен тому, что вы установили равным.

Ниже приведен пример, демонстрирующий то, что я пытаюсь сказать.

Это правильно?

//main function
int variable = 0;
int* val = &variable;
function1(val);
cout << *val << endl;
function2(val);
cout << *val << endl;
//Passing in a pointer with reference.
void function1(int*& value)
{
    int variable = 9;
    value = &variable;
}

//Passing in a pointer without reference.
void function2(int* val)
{
    int variable = 9;
    value = &variable;
}

Я предполагаю, что программа выдаст 9 вместо 8 или 0. Надеюсь, это даст вам, ребята, четкое представление о том, что я пытаюсь спросить.

1 Ответ

2 голосов
/ 26 апреля 2019

Разница между передачей значений и передачей ссылки такая же, как и для указателей, и для других значений (на самом деле указатели не являются чем-то особенным, они просто содержат числа, которые иногда являются адресами других объектов).

С int:

void foo(int x) { x = 1; }
void bar(int& x) { x = 2; }

int main() {
    int y = 5;
    foo(y);
    std::cout << y; // prints 5
    bar(y); 
    std::cout << y; // prints 2
}

Теперь с указателями:

void foo(int* x) { x = 0; }
void bar(int*& x) { x = 0; }

int main() {
     int y = 42;
     int* z = &y;
     foo(z);     
     std::cout << z; // prints the address of y
     bar(z); 
     std::cout << z; // prints 0
}

Обратите внимание, что ваш function1 сломан, потому что когда вы его называете

int* y;
function1(y);
std::cout << *y;    // **baaam**
                    // the value y points to is already gone

int внутри функции завершает свое время жизни, когда функция возвращается и вызывающая сторона не может использовать значение каким-либо значимым образом.Обратите внимание, что в этом конкретном примере вы, вероятно, напечатаете «правильное» значение, но это просто совпадение, и разыменование y после передачи его в function1 является неопределенным поведением.

...