通過聲明爲什麼聲明空隙F(const int的* P)被修改p
const int i;
顯然i
不能被修改。
那麼爲什麼聲明
void f (const int *p)
正在修改p
? (我測試了它,它正在修改p
但不知道如何?)。
通過聲明爲什麼聲明空隙F(const int的* P)被修改p
const int i;
顯然i
不能被修改。
那麼爲什麼聲明
void f (const int *p)
正在修改p
? (我測試了它,它正在修改p
但不知道如何?)。
的const
的位置。你倒着閱讀:
const int *p
的意思是「p是一個指向int
這是不變的」int * const p
的意思是「p是一個常量指針到int
」const int * const p
的意思是「p是一個常數指針恆定int
「向後閱讀對理解這一點非常有幫助。 – haccks
由於const
是int
通過p
,不p
指向 - 的指針int
。
const int *p
意味着p
是指向const int
,p
可以修改,*p
不。
用同樣的方法
int *const p
意味着p
不能被修改,而*p
可以。
請注意,const int* p
與int const* p
相同。
簡單的規則是聲明從右到左讀取:int const *p
意思是「p是指向常量int的指針」,int *const p
意思是「p是指向int的常量指針」。
在指針聲明事項(實際的完整的規則比較複雜,可以用http://cdecl.org/爲「解碼」 C風格的聲明。)
+1爲您的答案。 – haccks
因爲在這個表達式中,p
是一個指向const int
。這意味着你可以改變什麼p
指向。
這也意味着,「p」本身可以修改,但「p」的內容不能修改,所以*p = 10;
會產生錯誤。
一個例子清楚的事情:
#include <stdio.h>
void foo(const int *p)
{
int x = 10;
p = &x; //legally OK
// *p = 20; <- Results in an error, cannot assign to a read-only location.
printf("%d\n",*p);
}
int main(int argc, char *argv[])
{
const int x10 = 100;
foo(&x10);
return 0;
}
爲了使上述程序不修改指針都:的
#include <stdio.h>
void foo(const int *const p)
{
int x = 10;
p = &x; //legally NOT OK, ERROR!
// *p = 20; <- Results in an error, cannot assign to a read-only location.
printf("%d\n",*p);
}
int main(int argc, char *argv[])
{
const int x10 = 100;
foo(&x10);
return 0;
}
感謝您舉例說明。 – haccks
可能重複[是什麼字符\ *常量和const的區別char \ *?](http://stackoverflow.com/questions/890535/what-is-the-difference-between-char-const-and-const-char) –
再次維基鏈接:[Const Correctness](http ://en.wikipedia.org/wiki/Const-correctness#Pointers_and_references) –
@GrijeshChauhan;句子**因此,'const'將名稱修改爲右邊**在維基鏈接上引起混淆(第二段,第二行)。 – haccks