Почему меняется символ '&' на выходе этих двух кодов? - PullRequest
1 голос
/ 04 ноября 2019

Первый код:

int a = 1;

void func(int* ptr) {
    ptr = &a;
}

int main() {
    int nvar = 2;
    int* pvar = &nvar;
    func(pvar);
    std::cout << *pvar;
}
//Output: 2

Второй код:

int a = 1;

void func(int*& ptr) {
    ptr = &a;
}

int main() {
    int nvar = 2;
    int* pvar = &nvar;
    func(pvar);
    std::cout << *pvar;
}
//Output: 1

Единственное отличие - это символ '&' вФункция «Func». Но может ли кто-нибудь объяснить мне, что он делает в этой ситуации?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2019

Я знаю, что он делает, но во втором коде он объединяется с *, и я не знаю, что означает эта комбинация

T& обозначает "ссылку на T».

Теперь замените T на что угодно. Например, для указателя на int, T==int* у нас есть int*&, который является ссылкой на указатель на int.

Он ничем не отличается от передачи не указателей на функции в качестве ссылок. Когда ptr передается по значению, тогда func работает с копией, а при передаче по ссылке func работает с переданным экземпляром.

1 голос
/ 04 ноября 2019

& означает передачу по ссылке :

Разница между передачей по ссылке и передачей по значению заключается в том, что изменения, вносимые в аргументы, передаваемые посредствомссылка в вызываемой функции действует в вызывающей функции, тогда как изменения, внесенные в аргументы, передаваемые по значению в вызываемой функции, не могут влиять на вызывающую функцию. Используйте передачу по ссылке, если вы хотите изменить значение аргумента в вызывающей функции. В противном случае используйте передачу по значению для передачи аргументов.

Я думаю, что это говорит лучше, чем я мог.

...