C 为什么**指针2可以更改变量a? #包括 int main(){ int***指针3; int**pointer2; int*pointer1; INTA=10; 指针1=&a; 指针2=&a; 指针3=&a; *指针1=100; printf(“%d\n”,a); *指针2=200; printf(“%d\n”,a); *指针3=300; printf(“%d\n”,a); 指针3=&pointer2; 指针2=&pointer1; ***指针3=400; printf(“%d\n”,a); }

C 为什么**指针2可以更改变量a? #包括 int main(){ int***指针3; int**pointer2; int*pointer1; INTA=10; 指针1=&a; 指针2=&a; 指针3=&a; *指针1=100; printf(“%d\n”,a); *指针2=200; printf(“%d\n”,a); *指针3=300; printf(“%d\n”,a); 指针3=&pointer2; 指针2=&pointer1; ***指针3=400; printf(“%d\n”,a); },c,pointers,C,Pointers,这些代码把我弄糊涂了。我们知道pointer2是关于指针的指针,但它的值是变量“a”的地址。为什么*pointer2可以修改a的值。关于pointer3的相同问题?请帮帮我,非常感谢 这段代码不是有效的C语言,因此讨论任何形式的结果都只是猜测。如果编译器根据此代码生成二进制代码,则编译器已损坏,必须更换 具体来说,这是无效的C: # include <stdio.h> int main(){ int *** pointer3; int ** pointer2;

这些代码把我弄糊涂了。我们知道pointer2是关于指针的指针,但它的值是变量“a”的地址。为什么*pointer2可以修改a的值。关于pointer3的相同问题?请帮帮我,非常感谢

这段代码不是有效的C语言,因此讨论任何形式的结果都只是猜测。如果编译器根据此代码生成二进制代码,则编译器已损坏,必须更换

具体来说,这是无效的C:

# include <stdio.h>
int main(){
    int *** pointer3;
    int **  pointer2;
    int *   pointer1;
    int a = 10;
    pointer1 = &a;
    pointer2 = &a;
    pointer3 = &a;
    *pointer1 = 100;
    printf("%d\n",a);

    *pointer2 = 200;
    printf("%d\n",a);

    *pointer3 = 300;
    printf("%d\n",a);

    pointer3 = &pointer2;
    pointer2 = &pointer1;

    ***pointer3 = 400;
    printf("%d\n",a);

}
int**
不能分配给
int*
,也不能分配给
int***


(违反简单赋值规则的约束)

它是在
gcc(gcc)8.2.1 20181127上编译的。
@cloudyoung养成习惯,用
gcc-std=c11-pedantic errors
编译gcc,或者你可以得到由未知的、未记录的编程语言创建的二进制文件。@Lundin是的,它是这样做的。它是用警告编译的。嗯,是的。。。它确实编译并生成可执行文件,但。。。还有4条警告永远不应该被忽略。在gcc 7.3.0中,程序甚至可以运行(即输出“似乎正确”)。在gcc 8.2.0中,程序导致分段错误。这就是UB的表现形式。@C标准只要求在违反编程语言时,编译器必须显示诊断消息。它没有提到警告和错误。如果您无法区分误报和违反语言标准之间的区别,那么最好始终使用
gcc-std=c11-pedantic errors-Wall-Wextra
进行编译。如果您使用
gcc foo.c
编译,那么您不是为c语言编译,而是为机密gnu语言编译。您没有收到任何编译器警告吗?还是你只是忽视了他们?如果您没有收到任何警告,则需要了解如何更改编译器警告级别。如果您只是忽略了它们,那么只有一件事要说:永远不要忽略编译器警告。
pointer2 = &a;
pointer3 = &a;