空指针用于什么 我刚刚开始使用C++,并看到它们是指针的空值。我很好奇这是用来干什么的。添加一个指针指向“无”似乎是毫无意义的。
基本上,指针只是整数。空指针是值为0的指针。它并不是严格地指向零,而是指向绝对地址0,这通常是您的程序无法访问的;取消对它的引用会导致错误 它通常用作标志值,因此您可以使用它来结束循环 更新: 似乎有很多人对这个答案感到困惑,严格来说,这个答案是完全正确的。参见C11(ISO/IEC 9899:201x)§6.3.2.3指针第3节: 值为0的整型常量表达式或转换为void*类型的此类表达式称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行不相等比较 那么,地址是什么?这是一个数字n,其中0≤ N≤ <代码>最大地址。我们如何表示这样一个数字?这是一个整数,就像标准上说的 C11标准清楚地表明,在地址0处没有任何可引用的内容,因为在BSD 4.2中的一些旧的病理学不可移植代码中,您经常看到这样的代码:空指针用于什么 我刚刚开始使用C++,并看到它们是指针的空值。我很好奇这是用来干什么的。添加一个指针指向“无”似乎是毫无意义的。,c++,pointers,null-pointer,C++,Pointers,Null Pointer,基本上,指针只是整数。空指针是值为0的指针。它并不是严格地指向零,而是指向绝对地址0,这通常是您的程序无法访问的;取消对它的引用会导致错误 它通常用作标志值,因此您可以使用它来结束循环 更新: 似乎有很多人对这个答案感到困惑,严格来说,这个答案是完全正确的。参见C11(ISO/IEC 9899:201x)§6.3.2.3指针第3节: 值为0的整型常量表达式或转换为void*类型的此类表达式称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行
/* 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