空指针用于什么 我刚刚开始使用C++,并看到它们是指针的空值。我很好奇这是用来干什么的。添加一个指针指向“无”似乎是毫无意义的。

空指针用于什么 我刚刚开始使用C++,并看到它们是指针的空值。我很好奇这是用来干什么的。添加一个指针指向“无”似乎是毫无意义的。,c++,pointers,null-pointer,C++,Pointers,Null Pointer,基本上,指针只是整数。空指针是值为0的指针。它并不是严格地指向零,而是指向绝对地址0,这通常是您的程序无法访问的;取消对它的引用会导致错误 它通常用作标志值,因此您可以使用它来结束循环 更新: 似乎有很多人对这个答案感到困惑,严格来说,这个答案是完全正确的。参见C11(ISO/IEC 9899:201x)§6.3.2.3指针第3节: 值为0的整型常量表达式或转换为void*类型的此类表达式称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行

基本上,指针只是整数。空指针是值为0的指针。它并不是严格地指向零,而是指向绝对地址0,这通常是您的程序无法访问的;取消对它的引用会导致错误

它通常用作标志值,因此您可以使用它来结束循环

更新

似乎有很多人对这个答案感到困惑,严格来说,这个答案是完全正确的。参见C11(ISO/IEC 9899:201x)§6.3.2.3指针第3节:

值为0的整型常量表达式或转换为void*类型的此类表达式称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行不相等比较

那么,地址是什么?这是一个数字n,其中0≤ N≤ <代码>最大地址。我们如何表示这样一个数字?这是一个整数,就像标准上说的

C11标准清楚地表明,在地址0处没有任何可引用的内容,因为在BSD 4.2中的一些旧的病理学不可移植代码中,您经常看到这样的代码:

/* DON'T TRY THIS AT HOME */

int
main(){
    char target[100] ;
    char * tp = &target ;
    char * src = "This won't do what you think." ;
    void exit(int);

    while((*tp++ = *src++))
        ;

    exit(0);
}
这仍然有效C:

$ gcc -o dumb dumb.c
dumb.c:6:12: warning: incompatible pointer types initializing 'char *' with an
      expression of type 'char (*)[100]' [-Wincompatible-pointer-types]
    char * tp = &target ;
           ^    ~~~~~~~
1 warning generated.
$ 
在VAX上的4.2BSD中,您可以避免这种胡说八道,因为地址
0
可靠地包含值0,因此赋值计算为
0
,这当然是错误的

现在,我们来演示一下:

/* Very simple program dereferencing a NULL pointer. */

int
main() {
    int * a_pointer ;
    int a_value ;
    void exit(int);             /* To avoid any #includes */

    a_pointer = ((void*)0);
    a_value = *a_pointer ;

    exit(0);
}
结果如下:

$ gcc -o null null.c
$ ./null
Segmentation fault: 11
$ 

通常它是一个占位符。如果只声明一个指针,
int*a,无法保证当您要访问指针时,指针中有什么内容。因此,如果您的代码稍后可能会设置指针,也可能不会设置指针,那么无法判断指针是否有效,或者只是指向垃圾内存。但是如果您将其声明为
NULL
,例如
int*a=NULL
您可以稍后检查指针是否已设置,如
if(a==NULL)


初始化期间,我们将空值分配给指针,这样我们就可以检查它是否仍然是空的或者是否已经分配了地址。C和C++中的< /P> < P>空值等于0。但是C++中的代码> NulLPTR < /C> >不同,Null pTR始终是C++中的指针类型。出于各种原因,我们为指针变量指定一个空值

  • 检查是否已将内存分配给指针
  • 中和悬空指针,使其不会产生任何副作用
  • 检查返回地址是否为有效地址等

  • 在初始化过程中的大多数时间,我们将null值分配给指针,以便我们可以检查指针是否仍然为null或是否分配了地址

    嗯,空指针值有一个显著的特性,即尽管它是一个定义良好且唯一的常量值,确切的值取决于机器结构和ABI(在大多数现代的机器上都是零位,这并不重要),但它从不指向(或就在后面)对象

    这使得它可以在需要有效指针(函数可能会引发异常或终止执行)时用作可靠的错误指示器,也可以用作sentinel值,或标记缺少可选内容

    在许多实现中,通过空指针访问内存会可靠地导致硬件异常(有些甚至会在算术上出现陷阱),但在许多其他实现中,尤其是在没有分页和/或分段的实现中,不会出现这种情况

    似乎添加指向的指针是没有意义的 没什么


    不,不是。假设有一个函数返回可选的动态分配值。如果要返回“nothing”,则返回null。调用者可以检查null并区分两种不同的情况:返回值为“nothing”时和返回值为某个有效的可用对象时。

    您对这个主题怎么说?这是Tony Hoare的。背景:@tadman除了空指针不指向“无”之外。它指向绝对地址
    0
    。这通常是不可访问的,所以它会导致错误。@CharlieMartin从技术上讲,取消引用
    nullptr
    ,而不是“导致错误”。@passwayr怎么会这样?请给出C++的标准的一个节号。在这里,这个答案对所涉及的体系结构有很多假设。这确实是它的工作原理(或多或少),但从标准的观点来看,这是不正确的。@ HolyBlackCat“这确实是它的工作原理”通常。由于此类操作的UB性质(取消引用
    nullptr
    ),有时可以在
    nullptr
    class
    指针上调用一个不使用任何成员变量的方法。@n.m.但第一句话并不是完全错误。@n.m.胡说八道。你认为C中的指针是什么?地址,对吗?地址是什么?带0的自然数n≤ N≤ 最大地址。什么是空指针?它是一个值为0的地址。我的意思是,你可以查一下:C11(ISO/IEC 9899:201X)第63.2.3指针部分在C++Land中。@ TADMAN:如果你把它限制在C++ 11 +土地上,那就够了,虽然不是完全的图片。如果他们只是咬了子弹,拿走了<代码> null <代码>。@去复印机我们都有希望和梦想,最终被C++的TR压碎了。但是C++中的代码> NulLPTR < /C> >不同于它。“这听起来不对。你能详细说明一下吗?“nullptr在C++中始终是指针类型”实际上,
    nullptr
    的类型并不是指针类型<代码>*nullptr
    格式不正确。此答案实际上不正确。请参见下文,根据标准,空指针的值始终为0。@CharlieMart