該例子說明幾個問題
1. const int *p語義:
(1) const 修飾的是整個*p,所以*p是個常量,是不能被賦值的。
(2) p前並沒有用const修飾,所以p是指針變量,能被賦值重新指向另一個內存地址。
(3) int const *p 與 const int *p完全相同。
2. int *const p語義:
(1) p因為有了const修飾,所以p值是不可修改的。
(2) 整個*p的前面沒有const的修飾,也就是說,*p是變量,所以可以通過*p來修改它所指內存的值。
3. 總結:
(1) 如果const修飾在*p前,則不能改的是*p,p的值可以修改。
(2) 如果const是直接寫在p前面,則p不能改,*p的值可以修改。
4. 兩個基礎概念: 指針常量和常量指針(重點要分清總結的兩句話,至於叫什麼,知道就行,不必深究)
(1) 指針常量: 即指針本身的值是不可改變的,而指針指向的變量的值是可以改變的;
(2) 常量指針: 即指針指向的變量的值是不可改變的,而指針本身的值是可以改變的;
原文:徹底搞定C指針-姚雲飛
測試環境vc6.0
********************************************************************/
 
#include <stdio.h>
int main(void)
{
int i = 30;
int j = 40;
//==================================test const int *p==================================
/*const int *p = &i;
p = &j; //ok
//*p = 80; //error
j = 80;
printf("%d\n", *p);*/
//==================================test int *const==================================
/*int *const p = &i;
//p = &i2; //error
*p = 80;
printf("%d\n", i);*/
//========================情況1:int *p指針指向const int i常量========================
/*const int a = 40;
//int *p = &a; //error: cannot convert from 'const int *' to 'int *',否則p豈不是能修改a的值了嗎
int *p = (int *)&a; //ok
*p = 80;
printf("a = %d\n", a); //a還是40
printf("*p = %d\n", *p); //*p = 80*/
//========================const int *p指針指向const int i=============================
/*const int b = 40;
const int *p = &b; //ok
//*p = 80; //error
//b = 80; //error*/
//========================用const int *const p聲明的指針==============================
int c = 10;
int d = 20;
const int * const p = &c; //p的值不能改,也不能通過p修改c的值
//*p = 80; //error
//p = &d; //error
return 0;
}