5

程序:

int x;
int *y;
int **z;

z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));
x = 1;
*z = &x;
*y = x;
.
.
.

问题:有什么区别:

*z = &x;
*y = x;

根据我的理解,*z 指向 x 的地址,*y 指向 x,但是 *y 指向 x 不需要 x 的地址吗?我真的不明白这两个变量发生了什么。

编辑:我还想知道我们什么时候知道变量是在堆栈上还是堆上分配的?

  • 为什么 x、y 和 z 在堆栈上分配?
  • 为什么 *y, **y, *z, **z 分配在堆上?

最后,改变*z,改变**z吗?

4

2 回答 2

6

z是指向指针的指针(通常指向动态分配的指针数组)。

y是指向 的指针int。同样,它通常会指向一个动态分配的ints 数组。

因此,*z = &x;设置指向指向的z指针x。即,z指向一个指针,该指针(反过来)指向x.

*y = x;正在获取 的值并将x其分配给int指向的y

对于这样的事情,图片通常很有帮助。所以,我们的基本定义给了我们这个:

在此处输入图像描述

我们做的:

z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));

这给了我们这个:

在此处输入图像描述

然后我们这样做:

*z = &x;
*y = x;

这给了我们这个:

在此处输入图像描述

在所有这些中,虚线表示从一个地方到另一个地方的指针,而实线表示将一个值从一个地方复制到另一个地方。

然后我们可以考虑它们之间的长期差异。例如,考虑如果我们x=2;在上述所有分配之后添加会发生什么。

在这种情况下,*y将仍然等于1,因为我们将值1从复制x*y**z将相等2,因为它只是一个指向x-- 任何更改x都将反映在**z.

于 2013-05-12T14:22:25.660 回答
2

这一行将变量的地址x存储在指向的内存中z

*z = &x;

此行将 的x存储到 指向的内存中y

*y = x;

这两个赋值语句是不相关的:第二个复制,而第一个不复制。如果您更改 的值x然后检索**z,您将看到 的新值x;但是,检索*y会返回x(ie 1) 的旧值。

于 2013-05-12T14:20:33.033 回答