天天看點

const類型變量的詳細解讀

const類型變量

--------------------------------------

int i;

const int *p;

int *const p = &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;

p = &j;    //錯誤

i = 1;    //正确

*p = 1;    //正确

3.const int *const p = &i;

同時限制了指針指向的内容和指向的位址。

我的GitHub位址:

https://github.com/heizemingjun

我的部落格園位址:

http://www.cnblogs.com/chenmingjun

我的螞蟻筆記部落格位址:

http://blog.leanote.com/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】