C NULL宏和nul
如果代码中主要使用常量,我们将使用宏来定义常量。C NULL宏和nul,c,C,如果代码中主要使用常量,我们将使用宏来定义常量。 为什么将“NULL”定义为宏,而将nul(\0)定义为宏?宏必须扩展为非宏的内容。它不是。\0是一个八进制字符常量(表示二进制0),因此可以放在字符中。NULL不是空的 NULL表示无法访问的地址,其内部值取决于实现。但是,当在代码中用作指针时,它总是表示0,因此像if(p==NULL)这样的测试与if(!p)可能有一些微妙的原因可以用来证明这种差异,但我希望对零字符(ASCII中名为NUL的)不需要宏 NULL可以是实现选择的任何空指针常量,它
为什么将“NULL”定义为宏,而将nul(\0)定义为宏?宏必须扩展为非宏的内容。它不是。
\0
是一个八进制字符常量(表示二进制0),因此可以放在字符中。NULL不是空的
NULL
表示无法访问的地址,其内部值取决于实现。但是,当在代码中用作指针时,它总是表示0,因此像if(p==NULL)
这样的测试与if(!p)
可能有一些微妙的原因可以用来证明这种差异,但我希望对零字符(ASCII中名为NUL
的)不需要宏
NULL
可以是实现选择的任何空指针常量,它可以是整数或指针。因此,当您需要一个空指针常量时,可以使用它,但您不想给读者留下这样的印象,即使用哪个空指针常量很重要。基本上,当您希望指针为空指针时,可以使用它初始化/分配指针。您还可以在测试指针是否为null时使用它
不是每个人都愿意使用NULL
0
是允许的NULL
值,因此可以在任何可移植使用NULL
的地方使用0
。我个人认为,如果C语言没有NULL
,它不会变得更差。特别是,在varargs函数中传递NULL
可能会遇到麻烦,因为人们通常认为它是指针,如果需要,它会转换为指针,但varargs函数不会转换它。所以,如果它不是一个需要指针的指针,那么你就得到了UB。这同样适用于范围内没有原型的函数
您建议的宏将始终扩展为值为0的int
。“我们需要更多的写零的方法”在我看来并不是那种能激励C标准委员会采取行动的事情,即使它是被提议的。如果有一组宏命名基本执行集中的字符,那么在该集合中为NUL
指定一个宏是有意义的。但是人们似乎乐于编写'a'
而不是拉丁字母a
,'\n'
而不是换行符
,0
或'\0'
而不是NUL
,为什么1不被定义为宏ONE
?为'\0'
,即0
,设置宏有什么意义?对于NULL
它表示它是一个指针。@DanielFischer:除了NULL
不能保证它是一个指针之外。所以它实际上只是表示作者非常希望你想象它是一个指针,但并不关心它是否真的是;-)对,@Steve,我应该写“在指针上下文中使用”之类的。正确。转义序列的ascii值是27。因此,每当我们需要检查包含字符串的指针是否已完成时,我们可以使用值27定义的宏,而不是使用“\0”。@Angus”\0“
的ASCII值为0,它与“\ESC”
?@Angus:ASCII 27是ESC
”无关,但这和零终止字符无关,所以NULL是(void*)0=指向0 loc的地址,nul是0。我现在明白了:)虽然NULL可能不是地址零,但它将始终被视为0(正确的形式在内部处理)。e、 g.p=NULL;如果(p).
将失败。