C中的NULL概念有困难吗?

时间:2010-09-12 17:39:17

标签: c

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;
}

8 个答案:

答案 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指针。

  • 5.1这个臭名昭着的空指针究竟是什么?
  • 5.2如何在程序中获取空指针?
  • 5.3测试非空指针的缩写指针比较if(p)是否有效?如果空指针的内部表示非零,该怎么办?
  • 5.4什么是NULL以及如何定义?
  • 5.5如何在使用非零位模式作为空指针的内部表示的机器上定义NULL?
  • 5.6如果NULL定义如下:#define NULL ((char *)0)。那不会使传递uncast NULL的函数调用工作吗?
  • 5.7我的供应商提供#define NULL为0L的头文件。为什么?
  • 5.8 NULL对指向函数的指针有效吗?
  • 5.9如果NULL和0等效为空指针常量,我应该使用哪个?
  • 5.10但是如果NULL的值发生变化(可能是在具有非零内部空指针的机器上),使用NULL(而不是0)不是更好吗?
  • 5.11我曾经使用的编译器除非使用NULL否则无效。
  • 5.12我使用预处理器宏#define Nullptr(type) (type *)0来帮助我构建正确类型的空指针。
  • 5.13这很奇怪。保证NULL为0,但空指针不是?
  • 5.14为什么围绕空指针存在这么多混乱?为什么这些问题经常出现?
  • 5.15我很困惑。我只是无法理解所有这些空指针的东西。
  • 5.16鉴于围绕空指针的所有混淆,仅仅要求它们在内部由零表示会不会更容易?
  • 5.17说真的,有任何实际的机器真的使用非零空指针,或指向不同类型的指针的不同表示吗?
  • 5.18运行时整数值为0,强制转换为指针,保证是空指针吗?
  • 5.19如何访问位于机器位置0的中断向量?如果我将指针设置为0,编译器可能会将其转换为某个非零的内部空指针值。
  • 5.20运行时“空指针赋值”错误是什么意思?我该如何追踪它?

答案 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,您可以将charsints相乘,...

您正在做的是将null pointer constantvoid *类型)分配给intC允许这样做,但在混合类型时需要非常小心。

将空指针常量赋给int的结果与为其分配0的结果相同。因此,当i0时,您就开始了循环。

在没有初始化程序的情况下,静态自动变量初始化为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中定义和管理,但它们不是由语言提供的。