Что такое неявное разыменование в C ++ - PullRequest
1 голос
/ 10 июля 2011

Что именно означает неявное разыменование в C ++?Означает ли это, когда я передаю ссылку на переменную в параметр функции, мне не нужно & перед ней, чтобы использовать ее значение?

Ответы [ 2 ]

10 голосов
/ 10 июля 2011

Я предполагаю, что ваше учение пыталось объяснить разницу между указателями и ссылками.

Относительно ссылок (хотя и не технически точных) называют ссылки причудливыми указателями, которые неявно снимают ссылки.1003 *

int   x    = 5;
int*  xP   = &x;
int&  xR   = x;


xR  = 6; // If you think of a reference as a fancy pointer
         // then here there is an implicit de-reference of the pointer to get a value.

*xP = 7; // Pointers need an explicit de-reference.

Правильный способ думать - это , а не , чтобы использовать «Ссылка - причудливый указатель».Вы должны думать о ссылках в их собственных терминах.Это в основном другое имя для существующей переменной (AKA псевдоним).

Поэтому, когда вы передаете переменную по ссылке на функцию.Это означает, что функция использует переменную, которую вы передали через ее псевдоним.Функция имеет другое имя для существующей переменной.Когда функция изменяет переменную, она изменяет оригинал, потому что ссылка является исходной переменной (просто другое имя для нее).

Итак, чтобы ответить на ваш вопрос:

Мне не нужно & перед ним, чтобы использовать его значение?

Нет, вам не нужно добавлять &.

int f(int& x)  // pass a value by reference
{
    x =5;
}

int plop = 8;
f(plop);
// plop is now 5.
3 голосов
/ 11 июля 2011

Другой контекст, в котором C ++ будет неявно разыменовывать указатели, связан с указателями функций:

void foo() { printf("foo\n"); }

void bar() {
  void (*pf)() = &foo;
  (*pf)(); // Explicit dereference.
  pf(); // Implicit dereference.
}
...