C编程中的NULL可以告诉我在C中如何处理NULL? 而这个程序的输出是3,如何用NULL概念?
#include <stdio.h>
int main(void) {
int i;
static int count;
for(i = NULL; i <= 5;) {
count++;
i += 2;
}
printf("%d\n",count);
return 0;
}
答案 0 :(得分:21)
对于C,“NULL”传统上定义为(void *)0 - 换句话说,它是地址0的指针别名。对于C ++,“NULL”通常定义为“0”。 C ++和C中的NULL问题在于它不是类型安全的 - 您可以构建奇怪的结构,就像您在代码示例中包含的结构一样。
对于C ++,语言设计者通过添加新的“nullptr”类型来修复此问题,该类型可以隐式转换为任何指针类型,但不能转换为整数类型。
答案 1 :(得分:3)
NULL
只是stdio.h
中定义的宏或stdio包含的文件。它可以不同地定义为零的一些变化。
如果您通过C预处理器(通常为cc -E
)运行代码,您可以在实现时看到它的翻译内容:
void main(){
int i;
static int count;
for(i=((void *)0); i<=5 ;){
count++;
i+=2;
}
printf("%d",count);
}
这不仅是对NULL
的不必要的使用,而且是非常惯用的C代码,更普通的是:
int main(){
int i;
int count = 0;
for(i = 0; i <= 5; i += 2){
count++;
}
printf("%d\n",count);
return 0;
}
答案 2 :(得分:3)
有一整章专门讨论C FAQ中应该回答所有问题的Null指针。
if(p)
是否有效?如果空指针的内部表示非零,该怎么办?NULL
以及如何定义?NULL
定义如下:#define NULL ((char *)0)
。那不会使传递uncast NULL的函数调用工作吗?NULL
对指向函数的指针有效吗?NULL
和0等效为空指针常量,我应该使用哪个?NULL
的值发生变化(可能是在具有非零内部空指针的机器上),使用NULL
(而不是0)不是更好吗?NULL
否则无效。#define Nullptr(type) (type *)0
来帮助我构建正确类型的空指针。NULL
为0,但空指针不是?答案 3 :(得分:2)
NULL
具有大部分意义。处理整数时,最好只使用零。
严格地说,NULL
只是名称为零的值,但关于它的最重要的部分确实是它的名字。之所以存在是因为编写int* p = NULL;
而不是int* p = 0;
的模糊性较低。由于我们知道NULL
是一个指针,我们确信我的确意味着p
是一个指针。
因此,当您处理指针并希望代表地址 0
时,请使用NULL
。当您处理数字并希望代表数字 0
时,请使用0
。 (在您的示例中,您应该使用0
而不是NULL
。)
答案 4 :(得分:1)
NULL
应与0
同义。它更准确地用于表示空指针。
在这种情况下,代码实际上是:
for (i = 0; i <= 5)
{
count++;
i += 2;
}
答案 5 :(得分:0)
NULL由C定义为0.在您的程序中,它从0到5计数(每第二个数字计数)。这就是计数为3(i = 0,2,4)的原因。
不应该以这种方式使用NULL。 NULL应该与指针一起使用。
答案 6 :(得分:0)
NULL
的类型和i
的类型不同,但C
会原谅您:)
C
(大部分)不是“类型安全”语言。我的意思是:它可以让你混合其他语言会抱怨的类型。
使用C
,您可以将chars
添加到doubles
,您可以将chars
和ints
相乘,...
您正在做的是将null pointer constant
(void *
类型)分配给int
。 C
允许这样做,但在混合类型时需要非常小心。
将空指针常量赋给int的结果与为其分配0
的结果相同。因此,当i
为0
时,您就开始了循环。
在没有初始化程序的情况下,静态自动变量初始化为0
。这会发生在程序中的变量count
中。
因此,循环首先(count
变为1),i
为0,然后i
变为2。
现在循环开始(count
变为2),i
为2,然后i
变为4。
现在循环开始(count
变为3),i
为4,然后i
变为6。
循环终止......然后打印count
的值。
备注强>
main
应声明为int main(void)
printf("%d\n", count);
)return 0;
表示您的程序已成功完成操作系统答案 7 :(得分:0)
不要将c中的NULL指针与某些动态语言中的可空类型或数量的概念混淆。有类似的,但有不同的用途和含义。
在c中,NULL的概念仅在指针的上下文中本地使用,其中它是指向已知的无效内存位置的指针(通常但不总是由零表示)。
这与可以表示非固定性的类型或变量(非常)相同。请注意,这样的类型可以由用户在c中定义和管理,但它们不是由语言提供的。