Почему в объявлении я говорю int * p = NULL, а в тесте p! = NULL, почему бы * p! = NULL не соответствовать объявлению? - PullRequest
5 голосов
/ 11 марта 2011

в c ++, если мы присваиваем значение указателя NULL, почему не мы проверяем, *p!=NULL и вместо p!=NULL?

Iнашел этот код в учебнике.

int *p = NULL;
char *q = NULL;
// ...
if (p!=NULL) cout << *p;

Заранее спасибо

Ответы [ 5 ]

15 голосов
/ 11 марта 2011

* делает две разные вещи. Когда вы объявляете переменную, это означает, что переменная является указателем. Когда вы используете переменную, это означает «разыменование», то есть принимать значение в том месте, на которое указывает указатель. Два совершенно разных значения.

11 голосов
/ 11 марта 2011

Поскольку p - указатель, а *p - объект, на который он указывает.

6 голосов
/ 11 марта 2011

Я думаю, что вы в замешательстве. Код из учебника - , создающий указатель и инициализирующий его как NULL, затем он проверяет, является ли он NULL. Причина, по которой вы не проверяете, является ли *p != NULL, заключается в том, что он будет проверять, является ли то, на что он указывает, NULL, а не проверять, является ли сам указатель NULL.

.

Конечно, вы можете выбрать *p для проверки любого значения, которое вам нравится, при условии, что это допустимый указатель ... Все зависит от того, что вы хотите сделать.

EDIT:

Вы не присвоили NULL на *p, вы присвоили p. Заявление int *p = NULL; - это то же самое, что и запись:

int *p;
p = NULL;

int * это тип.

Как правило, когда вы пишете: if(p != NULL), вы просто проверяете, указывает ли p место, которое безопасно использовать *p.

1 голос
/ 11 марта 2011

Код объявляет указатель int через оператор int *p = NULL. Обратите внимание, что эти утверждения эквивалентны:

int *p = NULL;
int* p = NULL;

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

if(p != NULL)

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

0 голосов
/ 11 марта 2011

Потому что p - указатель; это переменная, которая содержит адрес памяти некоторого объекта.

Код проверяет, указывает ли указатель на объект, и, если это так, показывает значение этого объекта на экране.


if (p != NULL) // "if p is pointing to an object then ..."
{
    cout << *p; // "show me the value of that object on the screen"
}
  • p - адрес объекта
  • *p - это значение объекта, называемое разыменованием
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...