我正在尝试理解指针。在所附的代码中,我试图自己找出它们,但我有些困惑。我执行操作* y = z,我看到它使y指向分配给z的内存地址。但是* y = * x为什么不更改内存地址?
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int *x = malloc(sizeof(int));
*x = 3;
int *z = malloc(sizeof(int));
int *y = z;
*y = *x;
printf("x: %i, %p, %p \n y: %i, %p, %p \n z: %i, %p, %p \n", *x, x, &x, *y, y, &y, *z, z, &z);
free(x);
free(z);
}
结果:
x: 3, 0x17b1260, 0x7ffeed5957f8
y: 3, 0x17b1280, 0x7ffeed5957e8
z: 3, 0x17b1280, 0x7ffeed5957f0
感谢任何回答。
提供初始值已添加到定义,因此与表达式相比,其语法有点奇怪。
在赋值表达式中,我们写成“ 被赋值的事物 = 值”,这很简单。
在一个简单的声明中,我们编写“ type name”以声明name为类型为[[type的对象。在更复杂的声明中,我们提供了一种示例表达式,而不是名称。例如,声明“ [int
* name”表示* name是int
,这意味着name必须是指向int
的指针。声明的语法类似于“ type sample-expression”,其中声明告诉我们sample-expression的类型为type,而实际的类型为推导在示例表达式中声明的名称。
value
”。然后我们有“ 类型 样本表达式 = 值”。由于声明的构造方式,这并不是说sample-expression被赋予值value。它说sample-expression中的名称被初始化为值[[value。这种奇怪的声明结构可能会使学习C的人感到困惑,但这只是您必须习惯的东西。