简单的指针初始化

23 c++ pointers

我用指针已经有一段时间了,我想快速检查一下如何初始化一个整数指针?

a) int *tmpPtr = 0;

b) int *tmpPtr = null;

c) int a = 0;
   int *tmpPtr = &a;
Run Code Online (Sandbox Code Playgroud)

编辑

到目前为止,感谢您的所有答案.有趣的是,如果我按如下方式对指针进行初始化,则mem :: copy操作正常.

int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)

然后我在mem :: copy期间遇到崩溃...

奇怪的!

pax*_*blo 37

简单的问题很好,我认为已经确定SO应该适用于所有级别,而不仅仅是精英.

null在C中没有(除非你自己定义).初始化为空指针可以通过以下两种方式之一完成:

int *p = 0;
int *p = NULL;
Run Code Online (Sandbox Code Playgroud)

如果你p在那之后取消引用,你很可能会遇到访问冲突(我认为根据标准它是未定义的行为,所以真的,任何事情都可能发生,直到并包括宇宙的完全毁灭 - 它甚至可能继续运行很好,但我不会依赖它).

要获得指向实数的指针,只需使用:

int a = 7;
int *p = &a;
Run Code Online (Sandbox Code Playgroud)

使用address-of运算符.

重新编辑,它根本不奇怪,你只需要想象它.让我们假设所有变量都是从内存位置100开始创建的,整数和指针的长度都是4个字节.将您的两种情况分解为最简单的形式:

                                  int x = 2;
int *px = 0;                      int *px = &x;

         +-----+                          +-----+
px(100): |   0 |                  x(100)  |   2 |
         +-----+                          +-----+
                                  px(104) | 100 |
                                          +-----+
Run Code Online (Sandbox Code Playgroud)

然后执行命令

*px = 7;
Run Code Online (Sandbox Code Playgroud)

试图改变指向的变量px.

在左侧,您将尝试将值7写入内存位置0.这是一件坏事; 很少有系统允许你在没有崩溃的情况下做到这一点,更少的系统将允许它没有任何不利影响(某些版本的HP-UX实际上工作正常).

在右边是应该发生的事情.拾取的值为px100,因此值7将写入该内存位置,x并按预期更改.

我经常发现图片(甚至原始的ASCII艺术图片,因为我不是鲁本斯或波提切利)有助于澄清这些概念.希望它能为你清理一下.


pie*_*fou 6

在编辑中回复您的问题:

tmpPtr指向变量的地址,tmp它在堆栈中.请注意,tmpPtr指向的"安全区域"是tmp(在某些机器中为4,在其他机器中为2)的大小.如果要将大于sizeof(int)的字节复制到tmpPtr,则存在崩溃堆栈的风险.

tmpPtr的值为0,因此您将获得段故障.,这是操作系统提供的内存保护机制.例如,您不能写任何小于4K的虚拟地址.


RC.*_*RC. 1

您可以使用这些方法中的任何一种来执行此操作,但它是 NULL 而不是 null。我更喜欢 int *p = 0; 在 int *p = NULL 上;

为了消除我感觉的一些混乱,设置 int *p = 0 或设置 MyObject *p = 0; 导致同样的事情......如果您尝试取消引用它,空指针通常会使您的程序崩溃,尽管从技术上讲它是未定义的行为。C 中的示例与其他示例不同,因为您实际上将指针设置为指向设置为 0 的整数。

int *pNull = 0;
int c = *pNull; // 未定义的行为。最有可能使你的程序崩溃!

整数a = 0;
int *pInt = &a;

int x = *pInt; // x 等于 0

a = 10;
int y = *pInt; // y 等于 10