在C ++中设置指向地址0的指针有什么作用?

时间:2017-11-26 01:32:21

标签: c++ pointers

我目前正在练习理解C ++中的指针,什么是语法正确,什么不是。问题之一是:

#include <iostream>
#include <string>

int main()
{

int *pi;

pi = 0;

std::cout << pi ;

}

据我了解,pi是一个指向值*pi的指针。

在赋值之后,我使编译器显示没有错误,即使pi的类型是整数指针。我研究了它并找到了空指针,但是由

启动

int *p = 0;

而不是

int* p; 
p = 0;`

此作业是否指定了地址0的指针? 为什么不像

那样完成

int *pi = (int *)0x28ff44;

此外,即使没有错误警告,我也会输出值*pi。 编译器说Command terminated by signal 11

我做了禁止的事吗?如果没有,那背后的理由是什么?它只是空指针吗?

2 个答案:

答案 0 :(得分:2)

设置指向0的指针(通常)与将其设置为NULLnullptr相同,两者在内部通常为0。在立即分配它并在之后分配它之间真的没什么区别,编译器可能会弄清楚什么是做什么并做同样的事情。

空指针是C ++中完全有效的东西。什么&#34;禁止&#34;实际上正在使用它,好像它不是NULL。例如:

int* pi = 0; // This is fine, the pointer can take any value you want.

if (pi != 0) // This is also fine. The pointer can be inspected without harm.
  ...

if (*pi != 0) // This is NOT fine and your code will crash!
  ...

最后一个例子被称为&#34;解除引用空指针&#34;事情发生了可怕的错误。这就是为什么您经常会看到如下代码的原因:

if (pi != nullptr) // Ensure this pointer is not NULL.

良好的C ++代码将确保使用某些初始化任何指针变量,即使该内容为nullptr。未初始化的变量可以采用随机的无效值,如果您敢于取消引用它们将导致崩溃。

答案 1 :(得分:0)

只有4种方法可以指定指针。

1)将其设为NULL指针,这意味着您将其分配给值&#34; 0&#34;或&#34; NULL&#34;就像你做的那样。

2)将其分配给您希望指向的变量的地址(因为指针只指向内存中的地址)。这就是我相信你想要做的事情。您将创建一个整数变量(int x = 0;),然后将指针指定给x的地址(&amp;)。 (pi =&amp; x)。

3)您将其分配给另一个指针。

4)利用动态内存分配。

要打印指针指向的值,您必须使用*字符取消引用它 - &#34; cout&lt;&lt; * PI; //打印0&#34;

&#34; cout&lt;&lt; PI; //这样做会在内存中打印实际地址&#34;