为什么 *y = z 将 y 绑定到 mem 地址,但 *y = *x 只取一个值?

why *y = z binds y to the mem address, but *y = *x takes only a value?

我正在尝试理解指针。 在附带的代码中,我尝试自己弄清楚它们,但我有点困惑。 我执行 *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 

感谢任何回答的人。

提供初始值已添加到定义中,因此与表达式相比,它的语法有点奇怪。

在赋值表达式中,我们写“thing being assigned = value”,这很简单。

在简单的声明中,我们写“type name”来声明name到是 type 类型的对象。在更复杂的声明中,我们给出了一种示例表达式,而不是名称。例如,声明“int *name”表示 *name 是一个 int,这意味着 name 必须是指向 int 的指针。声明的语法类似于“type sample-expression”,其中声明告诉我们 sample-expression的类型为type,推导出示例表达式中声明的名称的实际类型。

为了向该声明添加初始化,我们附加“= value”。然后我们有“type sample-expression = value”。由于声明的构造方式,这并不是说 sample-expression 被赋予值 value。它说 sample-expression 中的名称初始化为值 value.

这种奇怪的声明结构可能会让学习 C 的人感到困惑,但这只是您必须习惯的事情。

int *x = malloc(sizeof(int)); 导致 x,而不是 *x,用 malloc(sizeof(int)) 初始化。

*x = 3 导致 *x,而不是 x,被分配 3