为什么* y = z将y绑定到内存地址,但是* y = * x仅采用一个值?

问题描述 投票:0回答:1

我正在尝试理解指针。在所附的代码中,我试图自己找出它们,但我有些困惑。我执行操作* 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 

感谢任何回答。

c pointers cs50
1个回答
1
投票

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

在赋值表达式中,我们写成“ 被赋值的事物 = ”,这很简单。

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

要向该声明添加初始化,我们附加“ =

value

”。然后我们有“ 类型 样本表达式 = ”。由于声明的构造方式,这并不是说sample-expression被赋予值value。它说sample-expression中的名称被初始化为值[[value。这种奇怪的声明结构可能会使学习C的人感到困惑,但这只是您必须习惯的东西。
© www.soinside.com 2019 - 2024. All rights reserved.