Какой из следующих методов является более правильным способом инициализации переменной?
// int x = NULL; `NULL` implies pointer
int x = 0; // 0 implies integer value and x is an integer.
А указатели?
void *p = NULL; // `NULL` implies pointer and p is a pointer.
//void *p = 0; // 0 implies integer value
что NULL равно 0
Он равен по значению, хотя, возможно, и по битовому шаблону. См. ниже +0.0, -0.0
пример.
Если бы NULL
всегда был равен 0, то в C он был бы не нужен.
NULL
- это а созвучный нулевой указатель - он часто, но не всегда имеет битовую комбинацию нулей. Указатель со значением NULL
всегда будет одинаково сравниваться с 0
: то же значение, разные битовые комбинации.
Помните, что ==
сравнивает значения, а не битовые комбинации.
void *a = NULL;
if (a == NULL) Always_True();
if (a == 0) Always_True();
Пример, который может помочь. +0.0
и -0.0
имеют одинаковое значение, один и тот же тип, но разные битовые комбинации. То же самое может произойти и с указателями.
int main(void) {
double pz = +0.0;
double nz = -0.0;
printf("=:%d bits:%d\n", pz == nz, memcmp(&pz, &nz, sizeof pz) == 0); // =:1 bits:0
return 0;
}
person
chux - Reinstate Monica
schedule
12.01.2016
NULL
не равно0
. - person Iharob Al Asimi   schedule 13.01.2016if ( 0 == NULL )
неправда? - person i486   schedule 13.01.20160
. - person Iharob Al Asimi   schedule 13.01.2016NULL
всегда будет иметь нулевое значение, хотя это может быть чистое выражение0
,(void *) 0
или какое-либо другое целочисленное выражение, которое оценивается как0
. - person John Bode   schedule 13.01.2016NULL
— это макрос. И для многих реализаций C это#define NULL ((void *)0)
.0
— целое число. Таким образом, указатель(void *)0
преобразуется вint
перед сравнением. Это уже определено реализацией и приведет к сбою (т. Е. Неопределенное поведение) в типичных 64-битных и других системах, гдеint
имеет меньше битов, чем указатель. - person too honest for this site   schedule 13.01.2016NULL
) всегда имеет нулевое значение. После преобразования соответствующий нулевой указатель value может иметь или не иметь нулевое значение. - person John Bode   schedule 13.01.20160
и 64-битную0
, я думаю, сравнение будет положительным. Это правда? - person i486   schedule 13.01.2016(void *)0
Стандарт немного двусмыслен здесь. Он допускает только0
как константу нулевого указателя (NPC) и указывает, что если константа нулевого указателя преобразуется в тип указателя, результирующий указатель называется нулевым указателем.... Проблема в том, что он также позволяет(void *)0
как NPC, который также является нулевым указателем из-за приведения к указателю (здесь не исключаетсяvoid *
). Я предпочитаю использовать представление null pointer, чтобы эта конструкция уже не была нулевой. Но это может быть спорно. - person too honest for this site   schedule 13.01.2016NIL
), было одним из худших решений в раннем C. C++ наконец-то исправил это с помощьюnullptr
— очень плохо, что C комитет не был таким смелым. - person too honest for this site   schedule 13.01.2016NIL
означает «Нет в списке». Для языков, основанных на списках, таких как LISP (ListProcessing), название сразу становится понятным. Обратите внимание, что библиотеки могут использоваться не только языками C или C++, но также, например. программами на Паскале. Некоторые библиотеки могут просто напечатать значение, например.0x0
, другие, например.(null)
. AFAIK никто не печатает прописные буквыNULL
- вероятно, по уважительным причинам. - person too honest for this site   schedule 13.01.2016