C 中直接通过名称访问变量和使用 *(&variable) 访问变量有什么区别?

Abh*_*aha 3 c pointers

假设我们声明一个变量

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

Eri*_*hil 9

*pt1 = 20;C 标准没有定义 的行为,因为pt1已被错误地设置为指向const int i. C 2018 6.7.3 说:

\n
\n

如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为为 undefined\xe2\x80\xa6

\n
\n

因此,整个程序的行为不是由 C 标准定义的。

\n

在具有已定义行为的 C 代码中,*(&i)被定义为产生 的值i。但是,在具有 C 标准未定义的行为的代码中,适用的正常规则将被*(&i)取消。它可以产生被初始化的值const i,它可以产生程序试图改变的值i,它可以产生一些其他值,它可能导致程序崩溃,或者它可能导致其他行为。

\n