C中的指针和内存分配

时间:2013-05-12 14:15:52

标签: 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;
.
.
.

问题: 有什么区别:

*z = &x;
*y = x;

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

y是指向int的指针。同样,它经常指向动态分配的int s。

数组

因此,*z = &x;正在设置z引用的指针指向x。即,z指向指针,指针(反过来)指向x

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

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

enter image description here

我们这样做:

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

这给了我们这个:

enter image description here

然后我们这样做:

*z = &x;
*y = x;

这给了我们这个:

enter image description here

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

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

在这种情况下,*y仍然等于1,因为我们将值1x复制到*y**z会等于2,因为它只是指向x的指针 - x中的任何更改都会反映在**z中。

答案 1 :(得分:2)

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

*z = &x;

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

*y = x;

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

答案 2 :(得分:0)

两个赋值之间的区别在于第一个(* z)是赋值 地址类型作为指针的值,其中第二个(* y)是y指向的地址的值赋值。

它们都将值分配给它们所指向的内存。

不同之处在于写入该分配内存的值的类型。 第一个值是一个地址,这就是为什么它将x的地址作为值。 第二个值是一个整数,因为它得到x的值。

* y不指向x。

它指向x的值被复制到的未知内存位置。 它将x的值赋给为y分配的内存空间。