我之前和我的教授发生了一场争论,我辩称NULL并不是一个指针,但他坚持认为它是,因为有NULL指针这个概念。现在我有点困惑,不确定NULL到底是不是指针。
我已经在网上搜索过了,但没有找到答案,所以我的最后一个选择就是在这里求助。
我之前和我的教授发生了一场争论,我辩称NULL并不是一个指针,但他坚持认为它是,因为有NULL指针这个概念。现在我有点困惑,不确定NULL到底是不是指针。
我已经在网上搜索过了,但没有找到答案,所以我的最后一个选择就是在这里求助。
NULL
是一个宏,它会被扩展成一个空指针常量。
7.19p3
空指针常量是一个整型常量表达式,并且其值为这些宏是:
NULL,它会扩展成一个实现定义的空指针常量; ...
0
(例如:0
、1-1
、42*0LL
等),或者是这样的一个表达式强制转换成(void*)
类型之后得到的结果。
6.3.2.3p3
大多数常见的C语言实现将值为0的整型常量表达式,或者这样一种表达式被强制转换为void*类型,称为null指针常量。如果将null指针常量转换为指针类型,则所得到的指针称为null指针,保证与任何对象或函数的指针不相等。
NULL
定义为0
、0L
或((void*)0)
。NULL
不一定是指针。NULL
中使用(void*)
类型转换,这意味着C++中的NULL
始终具有整型类型。由于C++中的void*
指针与常规指针不能轻易比较,因此C++11现在具有特殊的nullptr
关键字。)(void *)
的强制转换,那么它就具有(void)指针类型。 - Petr SkocikNULL
是一个宏,它扩展为一个非特定值,可以与指针进行比较。NULL
值可能具有void指针类型,也可能是整数。通常是0
,0L
或((void*)0)
。 - Petr SkocikNULL
宏关系不大,而更多地涉及到“空指针”作为一个概念。 - Raymond ChenNULL
本身不是指针,它是一个宏,可以用来将指针初始化为其类型的空指针值。当与指针比较时,如果指针是空指针,则相等,如果指针是其类型的有效对象指针,则不相等。
char *p = 0;
和char *p = NULL;
之间没有语义上的区别,但后者更明确,并且在其他操作数不明显是指针或与整数比较看起来像类型不匹配的情况下,使用NULL
而不是0
更加信息丰富:
FILE *fp = fopen("myfile", "r");
if (fp == NULL) {
/* report the error */
}
'\0'
和0
之间没有语义上的区别,它们都是int
常量。第一个是空字节,第二个是空值。明智地使用0
、'\0'
和NULL
可能看起来徒劳无功,但可以使代码更易读,不仅能让其他程序员更容易理解,也能让自己更容易理解。
混淆可能来自于拼写错误或听错了空指针作为NULL
指针。C标准经过仔细校对,只使用空指针并将NULL
仅称为宏NULL
。
注意,然而,接受的NULL
定义之一,#define NULL ((void*)0)
使NULL
成为指向void
的空指针之一。
关于“指向地址0的指针”的概念并没有问题。
规则是您被禁止对其进行解引用...它允许存在,如果创建将符合我能想到的“指针标准”。 仅仅因为它不是有意义地指向某个东西的指针...
(void *)
。 - S.S. Anne