C语言中空概念的困难?
C编程中的NULL有人能告诉我C是如何处理NULL的吗? 这个程序的输出是3,怎么用空概念呢C语言中空概念的困难?,c,C,C编程中的NULL有人能告诉我C是如何处理NULL的吗? 这个程序的输出是3,怎么用空概念呢 #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; } #包括 内部主(空){
#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;
}
#包括
内部主(空){
int i;
静态整数计数;
for(i=NULL;iNULL
is应该是0
的同义词。它更正确地用于指示空指针
在这种情况下,代码实际上是:
for (i = 0; i <= 5)
{
count++;
i += 2;
}
<代码> >(i=0;i<p),C,“null”通常定义为(空缺*)0,换句话说,它是指向地址0的指针别名。对于C++,“null”通常被定义为“0”。C++中的NULL和C的问题是它不是类型安全的。
对于C++,语言设计者通过添加一个新的“null pTR”类型来修复这个问题,它可以隐式地转换为任何指针类型,但不能转换成整数类型。 <代码> null >代码>它在处理指针时有其最大的意义。在处理整数时,最好使用零。
严格地说,NULL
只是一个有着奇特名称的值零,但它最重要的部分确实是它的奇特名称。它的存在是因为它比int*p=NULL;
写int*p=0;
更不模棱两可。既然我们知道NULL
是一个指针,我们可以肯定我的意思是p
我是一个指针
因此,当您处理指针并希望表示地址0
时,请使用NULL
。当您处理数字并希望表示数字0
,请使用0
(在您的示例中,应使用0
,而不是NULL
)C将NULL定义为0。在您的程序中,它从0计数到5(每2个数字计数一次)。这就是为什么计数为3(i=0,2,4)
NULL不应以这种方式使用。NULL应与指针一起使用。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
和i
的类型不同,但是C
原谅您:)
C
是(大多数情况下)不是一种“类型安全”语言。我的意思是:它允许你混合其他语言会抱怨的类型
使用C
可以将chars
添加到double
,可以将chars
和int
相乘
您正在做的是将一个空指针常量
(类型为void*
)分配给int
C
允许这样做,但是在这样混合类型时需要非常小心
将空指针常数赋值给int的结果与将0
赋值给int的结果相同。因此,您可以使用i
作为0
开始循环
在没有初始值设定项的情况下,静态自动变量被初始化为0
。这发生在程序中的变量count
因此,循环首先(count
变为1),i
为0,然后i
变为2。
现在循环变为(count
变为2),i
变为2,然后i
变为4。
现在循环开始(count
变为3),i
变为4,然后i
变为6。
循环终止…然后打印count
的值
注释
- 要符合标准,应声明
int main(void)
- 您应该在每一行完成后输出一个换行符(
printf(“%d\n”,count);
)
- 并且您应该
返回0;
,以指示您的程序已成功完成到操作系统
不要将c中的空指针与某些动态语言中的可空类型或数量混淆。它们有相似之处,但有不同的用途和含义
在c语言中,NULL的概念仅在指针上下文中使用,它是指向已知无效内存位置的指针(通常,但不总是,用零表示)
这与表示非设置性的类型或变量不同。请注意,这样的类型可以由用户在c中定义和管理,但不是由语言提供的。中有一整章专门讨论空指针,它应该回答您的所有问题
- 5.1这个臭名昭著的空指针到底是什么
- 5.2如何在程序中获取空指针
- 5.3用于测试非空指针的缩写指针比较
if(p)
是否有效?如果空指针的内部表示为非零怎么办
- 5.4什么是
NULL
,它是如何定义的
- 5.5在使用非零位模式作为空指针内部表示的机器上,应如何定义空
- 5.6如果
NULL
的定义如下:#define NULL((char*)0)
。这难道不会使传递uncast NULL的函数调用起作用吗
- 5.7我的供应商提供的头文件#将NULL定义为0L。为什么
- 5.8
NULL
对函数指针有效吗
- 5.9如果
NULL
和0等效为NULL指针常量,我应该使用哪一个
- 5.10但是如果
NULL
的值发生变化,可能在具有非零内部空指针的机器上,使用NULL
(而不是0)不是更好吗
- 5.11我曾经使用过一个编译器,除非使用
NULL
,否则它不会工作
- 5.12我使用预处理器宏
#define Nullptr(type)(type*)0
来帮助我构建
int main(){
int i;
int count = 0;
for(i = 0; i <= 5; i += 2){
count++;
}
printf("%d\n",count);
return 0;
}