在 C 中取消引用和将变量的地址分配给指针变量有什么区别?

Aze*_*mil 3 c pointers initialization memory-address dereference

看下面两个代码!

int main() {
    int a = 12;
    int *p;
    *p = a;
}
Run Code Online (Sandbox Code Playgroud)

和这个代码,

int main() {
    int a = 12;
    int *p;
    p = &a;
}
Run Code Online (Sandbox Code Playgroud)

在第一段代码中将指针解引用为 this *p = a,在第二段代码中,变量的地址a被设置为指针变量。

我的问题是这两段代码有什么区别?

Adr*_*ica 6

在你的第一段代码中:

int main() {
    int a = 12;
    int *p;
    *p = a;
}
Run Code Online (Sandbox Code Playgroud)

你有一个未定义行为的严重情况,因为你试图做的是将值分配给当前指向aint变量。但是,尚未分配“地址”,因此它将具有任意且无效的值!某些编译器可能会初始化为零(或),但这仍然是无效地址(在大多数系统上)。p ppNULL

您的第二个代码片段是“健全的”,但就目前而言,实际上并没有实现任何目标:

int main() {
    int a = 12;
    int *p;
    p = &a;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您正在为指针变量分配一个值(即地址p;在这种情况下,p现在指向a变量(即,它的值是地址a)。

因此,如果您附加这样的代码(在第二个代码段的末尾):

*p = 42;
Run Code Online (Sandbox Code Playgroud)

然后打印出 的值a,你会看到它的值已经从最初给定的12变成了42

随时要求进一步澄清和/或解释。

  • 正如我在回答中所说,打印的“地址”将是一个*任意*(某种随机)值。每次运行代码时它很可能会打印不同的“地址”。但这不是一个有效的地址(即它不“指向”有效的内存)。 (3认同)