今天被人问起,const关键字在与指针结合时的问题,一时无语。于是做了以下的实验:
char mychar = 'q';
char * mypoint = &mychar;
const char * myconst1 = &mychar;
char const * myconst4 = &mychar;
char * const myconst3 = &mychar;
const char const * myconst2 = &mychar;
const char * const myconst3 = &mychar;
char const * const myconst6 = &mychar;
const char const * const myconst5 = & mychar;
使用Intel C++ Compiler 8.0 编译,得出如下结果:
char mychar='5';
char * mypoint =&mychar; // common pointer
///define for const object
//const object must be initialize if not extern variable
int main ()
{
// Test for const 1
const char * myconst1 = &mychar; //a pointer which point to a const char
myconst1++; //Pass
++myconst1; //Pass
(*myconst1)++; //Error, can not modify the value
++(*myconst1); //Error, can not modify the value
// Test for const 2
char const * myconst2 = &mychar; // a pointer which point to a const char
myconst2++; //Pass
++myconst2; //Pass
(*myconst2)++; //Error, can not modify the value
++(*myconst2); //Error, can not modify the value
// Test for const 3
char * const myconst3= &mychar; //a const pointer which point to a char
myconst3++; //Error, can not modify the pointer
++myconst3; //Error, can not modify the pointer
(*myconst3)++; //Pass
++(*myconst3); //Pass
// Test for const 4
const char const * myconst4= &mychar; // a pointer which point to a const char
myconst4++; //Pass
++myconst4; //Pass
(*myconst4)++; //Error, can not modify the value
++(*myconst4); //Error, can not modify the value
// Test for const 5
const char * const myconst5= &mychar; // a const pointer which point to a const char
myconst5++; // Error
++myconst5; // Error
(*myconst5)++; // Error
++(*myconst5); // Error
// Test for const 6
char const *const myconst6= &mychar; // a const pointer which pointer to a const char
myconst6++; // Error
++myconst6; // Error
(*myconst6)++; // Error
++(*myconst6); // Error
// Test for const
const char const * const myconst7 = &mychar; // a const pointer which pointer to a const char
myconst7++; //Error
++myconst7; //Error
(*myconst7)++; //Error
++(*myconst7); //Error
return 0;
}
结论:
其实结论是最简单的,const按照从右到左的结合法则去读,就知道这个const定义的实际含义。比如说
const char const * myconst 与const char * myconst其实是等价的。