C语言中空概念的困难?

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; } #包括 内部主(空){

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;
}
#包括
内部主(空){
int i;
静态整数计数;

for(i=NULL;i
NULL
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;
    }