основной вопрос указателя c ++ - PullRequest
2 голосов
/ 27 октября 2010

если у меня есть такая функция:

void doSomething(int& aVar)
{
// do something
}

и у меня есть это:

int *aVar = new int;
*aVar = 10;

doSomething(*aVar);

Почему я должен вызывать * aVar?Разве это не адрес?

Ответы [ 4 ]

8 голосов
/ 27 октября 2010

Нет, ссылка не указатель. Ссылки гарантированно не будут нулевыми; Вы не можете сказать то же самое для указателя. Когда вы передаете int функции, которая ожидает int &, ссылка будет взята автоматически.

P.S. Не думайте об этом как об адресе или необычном указателе. Это ссылка или псевдоним существующего объекта .

2 голосов
/ 27 октября 2010
doSomething(int&)

хочет ссылку, а не указатель. Способ установить эту ссылку в качестве параметра - передать Int. Вот почему

doSomething(*aVar)

работает. Если вы хотите использовать указатель в функции, скажите

doSomething(int*)

ссылки и указатели не одно и то же (хотя у них много общего)

1 голос
/ 27 октября 2010

Звездочка, кроме умножения, имеет два значения:

a) Когда объявляет переменную : * x означает "X - указатель" b) Когда использует переменную : * x (когда x относится к типу указателя) означает «взять все, что указано х» - противоположность & x, что означает «взять адрес x».

Код:

doSomething(*aVar)

просто хочет разыменовать указатель «aVar» (принять значение типа int, указанное им) и передать это значение типа int в качестве параметра функции.

Переменная «aVar»"хранит адрес некоторого целочисленного значения, а не само значение, поэтому вам нужно использовать оператор" * "для разыменования его каждый раз, когда вы хотите получить доступ к целому числу, а не к самому адресу памяти.

Ссылки вC ++ довольно нелогичны («замаскированные указатели»), поэтому, если doSomething принимает ссылку на int, вы должны вызывать ее так, как если бы вы передавали фактическое значение типа int, а не указатель.Следовательно, вам нужен оператор разыменования.

0 голосов
/ 27 октября 2010

Указатель указывает на определенный адрес памяти, и указатель имеет свои собственные данные (то есть адрес памяти, на который он указывает). Когда вы передаете aVar в функцию без разыменования (оператор *) указателя, вы передаете местоположение памяти указателя, а не место памяти, на которое указывает указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...