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
被设置为指针变量。
我的问题是这两段代码有什么区别?
在你的第一段代码中:
int main() {
int a = 12;
int *p;
*p = a;
}
Run Code Online (Sandbox Code Playgroud)
你有一个未定义行为的严重情况,因为你试图做的是将值分配给当前指向a
的int
变量。但是,尚未分配“地址”,因此它将具有任意且无效的值!某些编译器可能会初始化为零(或),但这仍然是无效地址(在大多数系统上)。p
p
p
NULL
您的第二个代码片段是“健全的”,但就目前而言,实际上并没有实现任何目标:
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
。
随时要求进一步澄清和/或解释。