假设我们声明一个变量
int i = 10;
Run Code Online (Sandbox Code Playgroud)
我们有这两个声明 -
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)
printf("%d",*(&i));
Run Code Online (Sandbox Code Playgroud)
这两个语句打印相同的值,即10
从我对指针的理解来看,不仅它们的输出是相同的,而且上面两个语句的含义完全相同。它们只是同一声明的两种不同写法。
然而,我发现了一个有趣的代码——
#include <stdio.h>
int main(){
const int i = 10;
int* pt1 = &i;
*pt1 = 20;
printf("%d\n", i);
printf("%d\n", *(&i));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,结果是——
10
20
Run Code Online (Sandbox Code Playgroud)
这表明 ifi与限定符声明时*(&i)的含义不同。谁能解释一下吗?iconst
*pt1 = 20;C 标准没有定义 的行为,因为pt1已被错误地设置为指向const int i. C 2018 6.7.3 说:
\n\n如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为为 undefined\xe2\x80\xa6
\n
因此,整个程序的行为不是由 C 标准定义的。
\n在具有已定义行为的 C 代码中,*(&i)被定义为产生 的值i。但是,在具有 C 标准未定义的行为的代码中,适用的正常规则将被*(&i)取消。它可以产生被初始化的值const i,它可以产生程序试图改变的值i,它可以产生一些其他值,它可能导致程序崩溃,或者它可能导致其他行为。