2013-05-15 6 views
3

Я знаю, что указатель NULL является (void*)0 .Но то, что происходит, когда мы используем заявления вроде следующего:Является ли указатель NULL неявно преобразованным в тип (int *), когда мы используем «if (ptr == NULL)» для целочисленного указателя ptr?

if(ptr==NULL) 

где ptr может быть char, float или int указатель Является NULL гарантированно быть неявно преобразован к типу слева так же, как, например, в C, тип, возвращаемый malloc(), равен void*, но неявно преобразован в тип lvalue?

+0

strpbrk означает «string pointer break» –

+0

[This] (http://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0) может ответить на ваши вопросы. Проверьте выбранный ответ –

+0

И, наконец, NULL _not_ обязательно "(void *) 0". На некоторых платформах (Darwin!) Это просто «0». Следите за этим. В частности, никогда не делайте «printf («% p », NULL)» или «system (« thingy », NULL)», потому что он НЕ РАБОТАЕТ. –

ответ

6

Должен ли NULL быть неявным образом преобразован в тип слева? [...]

Да.

В соответствии с разделом 6.3.2.3.4 части ISO/IEC 9899:2011 C programming language standard:

Преобразование нулевого указателя на другой тип указателя дает нулевой указатель этого типа. Любые два нулевых указателя сравнивают одинаковые.

и раздел 6.3.2.3.1

Указатель на недействительной может быть превращена в или из указателя любого объекта типа. Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат сравнивается с исходным указателем .

0

Магия происходит из-за (void*). Указатель void может указывать на что угодно. Поэтому сравнение любого указателя с NULL вполне нормально.

+0

Немного более подробно pleasssseee !!! – Thokchom

+1

стандарт C устанавливает, что 'void *' должен быть совместим с любым другим типом указателя, и если ваш компилятор соответствует стандарту, вы никогда не должны беспокоиться о назначении и сопоставлениях с помощью указателей void. –

+1

NULL необязательно (void *) 0, поэтому, чтобы быть разборчивым и формальным, этот ответ неверен. – Lundin

2

Я знаю, что указатель NULL является (void*)0

Не обязательно. Макрос NULL можно определить как 0, (void*)0 или что-то еще. Единственное требование - совместимость с нулевым указателем для конкретной реализации. Теоретически, компилятор мог определить NULL как 1, но на практике никто этого не делает.

ли NULL гарантированно быть неявно преобразован в тип на левой

Да, любое выражение, где пустой указатель используется вместе с другим видом указателя дает нулевой указатель. Это не имеет ничего общего с некоторыми реализациями, определяющими NULL as (void *). Стандарт C просто гарантирует преобразование нулевого указателя, независимо от NULL-макроса.

в C, тип, возвращаемый malloc() является void *, но неявно преобразован в тип lvalue?

Да, в фотокаме void* всегда будет неявно преобразован в/из указателя другого типа (в C++, вы бы, однако, необходимо явное приведение).

 Смежные вопросы

  • Нет связанных вопросов^_^