空指针和未初始化指针之间的区别?

时间:2017-05-03 18:27:57

标签: c++

为什么可以打印空指针的值而不是未初始化的指针?我的意思是在初始化指向nullptr的指针时,你只是明确地使指针指向无处,对吗?如果是这样,那不就是没有初始化它,或者是否有我错过的东西?

谢谢!非常感谢!

5 个答案:

答案 0 :(得分:9)

指向无处,未被初始化,是两个不同的概念。

严格来说,未初始化的指针具有不确定值。它不是指向“无处”特定位置或指向对象的指针。这只是......“耸耸肩”。你还做不了什么。

“具体地点'无处'??”我听到你问。 “这是什么废话?”嗯,相当。它并非真的“无处”。空指针具有特定值和特定表示。它没有指向一个对象,但它仍然是一个单一的,可预测的已知值,为此用途保留。

有效指针:我在Kerrek的家里,或在工作中,或在酒吧等。
指针无效:我在Kerrek的家里,但是来自莫斯科的Vlad吹了它:(我正在看着火焰,哭了一下。
空指针:我在家里睡着了。请早上回来。
未初始化的指针:如果我还活着的话,我非常醉,并且没有世俗的想法。

答案 1 :(得分:3)

指针(类型T)是一个值,类似于整数或字符串等其他值,它可以处于以下三种状态之一:

  1. 它可以指向一个对象或一个过去的对象(这两个不是独占的),或者指向一个函数。如果指针指向对象或函数,则可以取消引用它。

  2. 它可以具有特殊值" null",在这种情况下,它比较等于T()nullptr以及其他表达式,如0NULLT(0)T(nullptr)

  3. 可能不属于上述情况。对于T类型的未初始化变量的值,这是正确的,但永远不会是T的prvalue。如果指针曾经指向一个对象但对象的生命周期已经结束,那也是如此。

  4. 请注意,只有case(2)(空指针​​)才能以编程方式检查!您通常无法判断非空指针是否有效(可能没有将指针与一组已知的有效指针进行比较)。

答案 2 :(得分:2)

  

我的意思是在初始化指向nullptr的指针时,你只是明确地使指针指向无处,对吗?如果是这样,那就不是没有初始化它。

两者都不相同!

参考:C ++入门

存储在指针中的值(即地址)可以处于以下四种状态之一:

  1. 它可以指向一个物体。
  2. 它可以指向刚好超过对象末尾的位置。
  3. 它可以是空指针,表示它未绑定到任何对象。
  4. 可能无效;除前三个以外的值无效。
  5. 当我们说指针初始化为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>