一只名叫tom的猫
我来解释下把,算了,直接给你写个程序让你看看把const int a=20;const int *p=&a;与下面的对比const int a=20;int *p=&a;现在来说一下,两种情况,a都是常量,所以不管在哪一种情况下a的值都不会改变的,而对于两个指针变量,就不相同了,一个是const指针而另外一个是非const指针,也就是说对于const指针的那种情况,其指针变量p的值与其指向的内容a都不可改变,因为他们都是const修饰的,而对于非const指针,则表示其指针变量p的值是可以改变的,但是其指针变量所指向的内容a依然是不可以改变的,所以你再看看你的那个程序了const a=2; //你没加类型难道编译器没报错?int *p;p=(int *)&a; //这里要注意啊,&a的类型是const int*,而p是int*的,你在这里进行的类型的强制转换,将const int*转换成了int*,否则不能赋值的*p=1;cout<<a<<" "<<*p<<endl;你可以对比下下面的程序#include <iostream>using namespace std;int main(){const int a=2;int *p;p=&a; //会报错*p=1;cout<<a<<" "<<*p<<endl;}下面的#include <iostream>using namespace std;int main(){const int a=2;int *p;p=(int*)&a; //不会报错*p=1;cout<<a<<" "<<*p<<endl;}有问题可以发消息给我补充:也不知道之前是怎么回复你的,不过,现在,收回上面的回复...最后修改下,给个权威答案#include<stdio.h>int main(){const int a=3;int *p=(int *)&a;*p=6;printf("%d\t%d\n", *p , p );printf("%d\t%d\n", a , &a );return 0;}你把它分别放到C++编译器上和C编译器上运行这段代码看看结果如何.如果你用C++编译器编译上述代码,那么这个问题的原因是编译器在编译时自动优化了const值,造成你的code变成 printf("%d\t%d\n", 3 , &a );我在这里瞎插一句把,感觉就有点像#define N 10然后用10替换了N的意味把,虽然这样说不准确但就这样理解把,的确是可以修改,只是编译器优化的缘故而导致输出的和想象的不一样了这就是权威答案,如果你学过汇编,你可以上汇编试试如果你用C语言编译器,你会发现,输出的都是6,因为C语言编译器并没有对它进行优化底下是汇编代码:INCLUDELIB LIBCMTINCLUDELIB OLDNAMESCONST SEGMENT$SG3833 DB '%d', 09H, '%d', 0aH, 00HORG $+1$SG3834 DB '%d', 09H, '%d', 0aH, 00HCONST ENDSPUBLIC _mainEXTRN _printf:PROC; Function compile flags: /Odtp_TEXT SEGMENT_a$ = -8 ; size = 4_p$ = -4 ; size = 4_main PROC; File c:\documents and settings\hwp\桌面\test.cpp; Line 3push ebpmov ebp, espsub esp, 8; Line 4mov DWORD PTR _a$[ebp], 3; Line 5lea eax, DWORD PTR _a$[ebp]mov DWORD PTR _p$[ebp], eax; Line 6mov ecx, DWORD PTR _p$[ebp]mov DWORD PTR [ecx], 6; Line 7mov edx, DWORD PTR _p$[ebp]push edxmov eax, DWORD PTR _p$[ebp]mov ecx, DWORD PTR [eax]push ecxpush OFFSET $SG3833call _printfadd esp, 12 ; 0000000cH; Line 8lea edx, DWORD PTR _a$[ebp]push edxpush 3push OFFSET $SG3834call _printfadd esp, 12 ; 0000000cH; Line 9xor eax, eax; Line 10mov esp, ebppop ebpret 0_main ENDP_TEXT ENDSEND看到了没有....这里; Line 8lea edx, DWORD PTR _a$[ebp]push edxpush 3push OFFSET $SG3834call _printfadd esp, 12 ; 0000000cH直接是push 3意思说直接输出的是数值3而不是变量值