为什么可以打印空指针的值而不是未初始化的指针?我的意思是在初始化指向nullptr的指针时,你只是明确地使指针指向无处,对吗?如果是这样,那不就是没有初始化它,或者是否有我错过的东西?
谢谢!非常感谢!
答案 0 :(得分:9)
指向无处,未被初始化,是两个不同的概念。
严格来说,未初始化的指针具有不确定值。它不是指向“无处”特定位置或指向对象的指针。这只是......“耸耸肩”。你还做不了什么。
“具体地点'无处'??”我听到你问。 “这是什么废话?”嗯,相当。它并非真的“无处”。空指针具有特定值和特定表示。它没有指向一个对象,但它仍然是一个单一的,可预测的已知值,为此用途保留。
有效指针:我在Kerrek的家里,或在工作中,或在酒吧等。
指针无效:我在Kerrek的家里,但是来自莫斯科的Vlad吹了它:(我正在看着火焰,哭了一下。
空指针:我在家里睡着了。请早上回来。
未初始化的指针:如果我还活着的话,我非常醉,并且没有世俗的想法。
答案 1 :(得分:3)
指针(类型T
)是一个值,类似于整数或字符串等其他值,它可以处于以下三种状态之一:
它可以指向一个对象或一个过去的对象(这两个不是独占的),或者指向一个函数。如果指针指向对象或函数,则可以取消引用它。
它可以具有特殊值" null",在这种情况下,它比较等于T()
和nullptr
以及其他表达式,如0
,NULL
,T(0)
和T(nullptr)
。
可能不属于上述情况。对于T
类型的未初始化变量的值,这是正确的,但永远不会是T
的prvalue。如果指针曾经指向一个对象但对象的生命周期已经结束,那也是如此。
请注意,只有case(2)(空指针)才能以编程方式检查!您通常无法判断非空指针是否有效(可能没有将指针与一组已知的有效指针进行比较)。
答案 2 :(得分:2)
我的意思是在初始化指向nullptr的指针时,你只是明确地使指针指向无处,对吗?如果是这样,那就不是没有初始化它。
两者都不相同!
参考:C ++入门
存储在指针中的值(即地址)可以处于以下四种状态之一:
当我们说指针初始化为nullptr
时,意味着指针没有绑定到任何对象。
未初始化的指针处于无效状态(上面的第4点)。
您可以检查指针是否为null,但是取消引用未初始化的指针是未定义的,可能会导致运行时崩溃。
答案 3 :(得分:2)
nullptr
无处可去,没关系!并且是一个很好的做法,初始化指向此定义值的指针。
但是,如果没有初始化,它可以指向任何地方,它是未定义的并且可能导致未定义的行为
答案 4 :(得分:2)
在某些语言中,如C#和Java,未初始化的指针包含NULL。
另一方面,C ++遵循的理念是不浪费任何时钟周期做一些你没有明确要求的事情,(语言的成功程度是另一回事),所以C ++不会浪费任何时间初始化指向NULL的指针,因此在C ++中,未初始化的指针被认为包含垃圾。
垃圾问题是你以后不能说if( pointer == garbage ) { pointer = someMeaningfulValue; }
,因为你不知道垃圾值是什么,以便与之进行比较。你无法重现它。
所以,通过说pointer = NULL;
你已经用一个事先已知的值初始化了指针,(并代表“Point To Nothing”,)所以你以后可以安全地做if( pointer == NULL ) { pointer = someMeaningfulValue; }
。 / p>