计划:
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的地址?我真的不明白这两个变量是怎么回事。
编辑: 我还想知道何时知道何时在堆栈上或堆上分配变量?
最后,改变* z,改变** z?
答案 0 :(得分:6)
z
是指向指针的指针(通常指向动态分配的指针数组)。
y
是指向int
的指针。同样,它经常指向动态分配的int
s。
因此,*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
中。
答案 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分配的内存空间。