C中的指针和内存分配

Sol*_*ves 5 c pointers memory-management

程序:

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

z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));
x = 1;
*z = &x;
*y = x;
.
.
.
Run Code Online (Sandbox Code Playgroud)

问题:有什么区别:

*z = &x;
*y = x;
Run Code Online (Sandbox Code Playgroud)

从我的理解*z指向x和*y的地址指向x,但是*y指向x不需要x的地址?我真的不明白这两个变量是怎么回事.

编辑:我也想知道何时知道何时在堆栈上或堆上分配变量?

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

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

Jer*_*fin 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));
Run Code Online (Sandbox Code Playgroud)

这给了我们这个:

在此输入图像描述

然后我们做:

*z = &x;
*y = x;
Run Code Online (Sandbox Code Playgroud)

这给了我们这个:

在此输入图像描述

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

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

在这种情况下,*y仍然会平等1,因为我们复制的数值,1x*y.**z将等于2虽然,因为它只是一个指针x-中的任何变化x将反映**z.