各式表示的意思分别为:
A const int* a = &b; //*a是const,但指针a可变
B const* int a = &b; //a是const,但*a可变
C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变
D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变 因此C,D两者是相同的。
总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
int main() { int a=5; int b=10; int
c=20; cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl; const int *p1=&b;
p1++; // *p1=20; int const *p2=&b; p2++;
// *p2=20; const *int p3=&b;
// : warning C4518: 'int ' : storage-class or type specifier(s)
unexpected here; ignored p3++; // *p3=20;
int * const p4=&b;
// p4++; *p4=100;
const int * const a1=&b; int const * const
a2=&b; // a1++; // a2++; // *a1=200; // *a2=100;
cout<<*p1<<" "<<*p2<<"
"<<*p3<<" "<<endl;
return 0; }
程序中,变量a,b,c存储在栈中,存储的地址按低地址方向扩展。 const int *p1, int const *p2,
const * int p3都指向b的地址,由以上可知p1,p2,p3都是指向常对象的指针,即指针所指向的对象
不能更改,但指针可以更改,如进行++操作。进行++以为操作后,指向变量a的地址,所以进行解引用(*)时输出变量a的值。p3//// :
warning C4518: 'int ' : storage-class or type specifier(s) unexpected
here; ignored 而对于指针p4,int * const
p4=&b,*位于const的左边,const修饰的是指针p4,即指针不能改变,但是可以改变指针所指向的对象。
同理const int * const a1=&b;,int const * const
a2=&b;是指向常量的常指针,即指针本身和其指向的对象都不能更改。
各式表示的意思分别为: A const int* a = &b; //*a是const,但指针a可变 B const* int a = &b; //a是const,但*a可变 C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变 D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变 因此C,D两者是相同的。 总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
A const int* a = &b; //*a是const,但指针a可变
B const* int a = &b; //a是const,但*a可变
C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变
D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变 因此C,D两者是相同的。
总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。