void main()

{
/**//**
* 非常量指針, 是指向常量數(shù)據(jù)的指針
*/
{
const char *p1;
char a = 20;
char b = 20;
p1 = &a;
// *p1 = 10; 出錯, 不能改變 p1 指向的內(nèi)容
p1 = &b; //正確, 可以改變 p1 本身的內(nèi)容
}

/**//**
* 非常量指針, 是指向常量數(shù)據(jù)的指針
* 跟 const char *p1; 相同
*/
{
char const *p2;
char a = 20;
char b = 20;
p2 = &a;
// *p2 = 10; 出錯, 不能改變 p1 指向的內(nèi)容
p2 = &b; //正確, 可以改變 p1 本身的內(nèi)容
}

{
/**//**
* 常量指針, 但并非指向常量數(shù)據(jù) 的指針
*/
char a = 20;
char b = 20;
char * const p3 = &a; // 由于是常量指針, 故需要在初始化時賦值, 之后不能改變
// p3 = &b; // 出錯, p3 是常量指針, 不能改變它的值
*p3 = 30; // 但 p3 指向的內(nèi)容不是常量, 可以進(jìn)行改變
}
// [const] [類型] [星號]
// 123 [const] [類型] [星號] const int *
// 132 [const] [星號] [類型] const * int
// 213 [類型] [const] [星號] int const *
// 231 [類型] [星號] [const] int * const
// 312 [星號] [const] [類型] * const int
// 321 [星號] [類型] [const] * int const
{
// const int * p1; // 上面第一種 非常量指針, 是指向常量數(shù)據(jù)的指針
// const * int p2;
// int const * p3; // 上面第二種 非常量指針, 是指向常量數(shù)據(jù)的指針
// int * const p4 = 0; // 上面第三種, 常量指針, 但并非指向常量數(shù)據(jù) 的指針
// * const int p5;
// * int const p6;
}
// 只剩下 const* int p2; 了
{
// warning C4518: 'int ' : storage-class or type specifier(s) unexpected here; ignored
// 'int': 此處不應(yīng)出現(xiàn)存儲類或類型說明符;已被忽略
// const* int p2;
// int a = 20;
// p2 = &a;
// *p2 = 30; // 此處會出錯, 不能修改 p2 所指向的地址的值, 故是指向常量的指針
// 編譯器將 const * int p2; 相當(dāng)于 const int *p2 //
}
// 總結(jié)
// const int * p1; // 上面第一種 非常量指針, 是指向常量數(shù)據(jù)的指針
// const * int p2; // 相當(dāng)于 const int *p2; 指向常量數(shù)據(jù)的指針 // 但編譯器會出警告
// int const * p3; // 上面第二種 非常量指針, 是指向常量數(shù)據(jù)的指針
// int * const p4 = 0; // 上面第三種, 常量指針, 但并非指向常量數(shù)據(jù) 的指針
// 將它們分類
// const int * p1; // 上面第一種 非常量指針, 是指向常量數(shù)據(jù)的指針
// int const * p3; // 上面第二種 非常量指針, 是指向常量數(shù)據(jù)的指針
// const * int p2; // 相當(dāng)于 const int *p2; 指向常量數(shù)據(jù)的指針 // 但編譯器會出警告
// int * const p4 = 0; // 上面第三種, 常量指針, 但并非指向常量數(shù)據(jù) 的指針
// 可以得出
// const 只要在 * 號前,無論星號在什么位置, const 是修飾指向的數(shù)據(jù)類型,所以是 指向常量數(shù)據(jù)的指針, 但 * 號擺中間會有 C4518 警告
// const 只要在 * 號后,只有一種,這時, const 修改指針本身,是一個指針常量

{
// 如果是
int * const * p = 0;
// 那就是指向 常量 的指針常量了
}
}




