Разница между этими двумя утверждениями? - C ++ - PullRequest
4 голосов
/ 08 февраля 2010

Я студент по программированию, пытаюсь лучше понять указатели, одна из вещей, которые я узнал, это то, что вы можете установить указатель на NULL. У меня вопрос, в чем разница между этими двумя утверждениями? Когда каждый из них вернет истину / ложь?

if (some_ptr ==  NULL)

if (*some_ptr == NULL)

Спасибо!

Ответы [ 5 ]

9 голосов
/ 08 февраля 2010

Первый сравнивает адрес переменной с нулевым, второй разыменовывает указатель, получает значение, хранящееся в нем, и сравнивает его с нулевым.

3 голосов
/ 08 февраля 2010

Первый оператор относится к фактическому адресу, на который указывает указатель some_ptr. В случае, если это NULL (значение, представленное определением NULL), это истина, иначе нет.

Последнее утверждение относится к содержимому по адресу, на который указывает указатель. Так что если у вас есть some_ptr, указывающий на целое число, и это целое число совпадает с вашим нулевым определением, второе условие оценивается как истинное.

1 голос
/ 08 февраля 2010

Первый говорит:
some_ptr NULL?

Второй говорит:
независимо от того, на что указывает some_ptr NULL?

1 голос
/ 08 февраля 2010

Во-первых, вы сравниваете сам указатель с NULL, что кажется желательным.

Во-вторых, вы сначала разыменовываете указатель, чтобы получить значение, которое затем сравнивается с NULL, как если бы вы сравнивали значение int с 0. на основе имени вашей переменной.

0 голосов
/ 08 февраля 2010

Например: int * x; Здесь, если вам нравится проверять, указывает ли x на NULL, тогда мы используем первое утверждение. При использовании того же int * x, если вы используете второе выражение, вы пытаетесь разыменовать указатель и проверить значение, на которое указывает x. Поскольку NULL равен 0 в C, C ++ проверяет значение 0, на которое указывает x.

РЕДАКТИРОВАТЬ: Также со вторым оператором, если x указывает на NULL, то отсылка NULL-указателя приводит к удалению ядра в UNIX.

...