補充知識
- “const int i”與“int const i”之間的區別
- 對變量來說,const 關鍵字可以限定一個變量的值不允許改變,從而保護被修飾的東西,防止意外修改,在一定程度上可以提高程序的安全性和可靠性。
代碼
const int *
int i1 = 10;
int i2 = 20;
const int *p = &i1;
/* 輸出結果是10 */
printf("%d\n", *p);
p = &i2;
/* 輸出結果是20 */
printf("%d\n", *p);
i2 = 30;
/* 輸出結果是30 */
printf("%d\n", *p);
- 為什么 p 的值是可以被修改的,它可以重新指向另一個地址呢
- 這里的 const 關鍵字修飾的是整個“*p”,而不是 p。所以這里的“*p”是不能被賦值的,也就是說我們不能通過“*p”來修改 i2 的值。
- 其次,p 前并沒有用 const 關鍵字進行修飾,所以 p 是指針變量,能被賦值重新指向另一內存地址。也就是說下面的代碼是合法的:p = &i2; i2 = 30;
- “int*const p”這種聲明形式。很顯然,這里的 const 是寫在 p 前和 * 號后的,而不是寫在“*p”前的,所以它是用來修飾限定 p 的
int *const
int i1 = 10;
int i2 = 20;
int *const p = &i1;
/* 輸出結果是10 */
printf("%d\n", *p);
/* p=&i2; p不能再這樣重新賦值了,即不能再指向另一個新地址*/
/* 可以通過*p修改i1的值*/
i1 = 30;
/* 輸出結果是30 */
printf("%d\n", *p);
- p 因為有了 const 的修飾,所以只是一個指針常量。因此,這里的 p 值是不能重新賦值修改的,它只能永遠指向初始化時的內存地址。即下面的代碼是不合法的:
- p = &i2; //p不能再這樣重新賦值了,即不能再指向另一個新地址
- 但是,也正因為這里的整個“*p”的前面沒有 const 修飾。也就是說,“*p”是變量而不是常量,所以我們可以通過“*p”來修改它所指內存 i1 的值。因此,下面的語句是合法的:
- 由此可見,如果關鍵字 const 直接寫在“*p”前,則程序不能修改“*p”,但可以修改 p;如果關鍵字 const 直接寫在 p 前,則程序不能修改的是 p,但可以通過“*p”來修改它所指內存的值。理解這兩點很重要,否則很難掌握“const int*p”與“int*const p”兩者之間的根本區別。
總結
const int i=10;
int *p;
/* 強制類型轉換*/
p= (int *) &i;
printf("*p=%d\n",*p)
/*這種賦值是合法的*/
*p=20;
printf("i=%d\n",i);
printf("*P=%d\n",*p);
- 因為 const int 類型的 i 的地址是不能賦值給指向 int 類型地址的指針 p 的(否則 p 豈不是能修改i的值)。因此下面的語句是不合法的:p = &i
- 可以通過強制類型轉換進行賦值,因此下面的這種賦值方法是合法的? p= (int *) &i;? *p=20;
- 盡管可以通過強制類型轉換進行賦值,也不能通過“*p=20”來修改 i 的值。因此,“printf("i=%d\n”,i)”輸出的結果是 10,并不是 20。
- 示例運行結果為:*p=10? i=10? *p=20
第一個是指針,第二個是指針所指物
p是指指針,*p是指指針所指物
const *p,限制的是(*p),*p不可以動,p可以動
* const? p 限制的是(p),p不可以動,*p可以動
參考鏈接
- C語言const int *a和int*const a 的區別詳解