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/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】