const類型變量
--------------------------------------
int i;
const int *p;
--------------------------------------
int i;
int *const p = &i;
--------------------------------------
int i;
const int *const p = &i;
三者有何區別呢?
--------------------------------------
指向常量的指針 和 指針常量
const int *p; //定義一個指向常量的指針。
int *const p; //定義一個指針常量,一旦指向某一變量的地址后,不可再指向其他變量的地址。(注意:指針常量也叫常量指針)
二者區別:
const int *p; //p是一個變量,但指向一個常量。(即p可以指向任何地址,但是只能通過*p來讀這塊地址的內容,不能通過*p來寫這塊地址的內容)
int *const p; //p是一個常量,但指向一個變量或者常量。(即如果一旦p指向了任何一個有效的地址后,就不可再指向其他變量的地址,但可以通過*p來讀寫這塊地址的內容)
--------------------------------------
1. const int *p;
const用來修飾int *,*p的內容不可變。
1 linux下示例代碼如下: 2 3 #include <stdio.h> 4 5 int main01() 6 { 7 int a = 0; 8 int *p = &a; //此時的p指向了一個int類型的地址,可以通過*p的方式來修改這個內存a的值。 9 *p = 10; 10 printf("a = %d\n", *p); //或者printf("a = %d\n", a); //此時的*p可讀可寫。 11 12 return 0; 13 } 14 15 int main() 16 { 17 int a = 0; 18 const int *p = &a; //此時的p指向了一個int類型的地址,但不可以通過*p的方式來修改這個內存a的值。 19 //*p = 10; 20 a = 10; //但是呢,不可以通過*p來改a的值,可以通過a去修改a的值。 21 printf("a = %d\n", *p); //或者printf("a = %d\n", a); //此時的*p可讀不可寫。 22 23 //c語言的一個小漏洞 24 const int b = 100; 25 //b = 0; //定義了一個常量,那么這個常量權限是只讀了。 26 27 //通過指針的方法:即可以通過指向一個變量地址的指針去指向它,然后通過*p1去間接的修改b的值。 28 //注意編譯的時候會出現警告!我們忽略這個警告強行改!這時把b的值改了!!! 29 //warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 30 //警告:賦值時從指針目標類型丟棄“const”限定符[-Wdiscarded-qualifiers] 31 32 //這就是在c語言中用常量的時候不用const了! 33 //因為c語言中的const是有問題的,因為可以通過指針變量間接的修改const定義的常量的值,所以在c語言中用#define定義常量的時候更多。 34 35 //為什么#define不能改呢?實質上#define就是一個文本替換,直接把它替換成一個整數了,整數是一個常量,又不是一個變量。 36 //但是在C++中就沒有這個漏洞了。為什么呢?因為c++里面的const是個真的const,而c語言中的const只是在語法的角度不讓你去賦值,實際上是假的。 37 //這是c語言本身存在的弱項。 38 39 int *p1; 40 p1 = &b; //為了避免這個warning,使用強轉即可:p1 = (int *)&b; 41 *p1 = 0; 42 printf("b = %d\n", b); //或者printf("b = %d\n", *p); 43 44 int *const p2 = &a; //表示p2指向了a的地址,而且p2只能指向a的地址,不可再指向其他變量的地址。 45 //p2 = &b;//直接編譯錯誤//p2是一個常量指針,p2只能指向固定的一個變量的地址,但可以用*p2讀寫這個變量的值。 46 47 return 0; 48 }
2. int *const p = &i;
const用來修飾p,p是一個常量指針,p只能指向固定的一個變量的地址,但可以用*p讀寫這個變量的值。
指針p的地址不可變。即表示p指向了i的地址,而且p只能指向i的地址,不可再指向其他變量的地址。
int i = 0;
int j = 0;
int *const p = &i;
p = &j; //錯誤
i = 1; //正確
*p = 1; //正確
3.const int *const p = &i;
同時限制了指針指向的內容和指向的地址。