const類型變量的詳細解讀


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;

同時限制了指針指向的內容和指向的地址。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM