今天看《linux核心程式設計》(claudia salzberg podriguez等著)時,文中(p39)有乙個錯誤,就是關於const的用法。
原文中舉例說明:const int *x中x是乙個指向const整數的指標,因此可以修改該指標,不可以修改這個整數。而在int const *x中,x卻是乙個指向整數的const指標,因而這個整數可以改變,但是指標不可以改變。本來我也對這個不是很懂,於是就寫了個測試例子測了一下:
測試一,const int *x,**如下:
1int b = 1,a=3;2
const
int *c = &a;
3 c = &b;
4 printf("
c is %d\n
",*c);
測試結果:c is 1,即,指標可以修改
修改下:
1int b = 2;2
const
int *c = &b;
3 *c = 5
;4 printf("
c is %d\n
",*c);
測試結果,編譯錯誤(gcc):
line 3 , error: assignment of read-only location '*c'
由此證明該書中對於 const int *x的描述是正確的,然而問題在於對int const *x 的描述:」
因而這個整數可以改變,但是指標不可以改變「
卻是錯誤的。
測試二:
1int g = 22;2
intconst *d;
3 d = &g;
4int f = 23
;5 d = &f;
6 printf("
d is %d\n
",*d);
測試結果 d is 23,這個指標是可以改變的!
改一下:
1int g = 22;2
intconst *d;
3 d = &g;
4 *d = 12
;5 printf("
d is %d\n
",*d);
測試結果,編譯錯誤(gcc)
line 4 , error: assignment of read-only location '*d'
所以,const int *x 和 int const *x是一樣的,他們都是乙個指向const整數的指標,可以修改該指標,但是不能修改這個整數。
從這篇文章也得出相同結論。
那麼正確的:」指向乙個整數的const指標,即整數可變,指標不可變「 用const應該怎麼定義?
測試三:
1int g = 22;2
int * const d = &g;
3int e = 24
;4 d = &e;
5 printf("
d is %d\n
",*d);
結果:編譯出錯:
line 4 error: assignment of read-only variable 'd'| 即:不能改變指標d
改一下:
1int g = 22;2
int * const d = &g;
3 *d = 24
;4 printf("
d is %d\n
",*d);
測試結果:
d is 24,即可以修改整數。
所以int * const x 是 指向乙個整數的const指標,即整數可變,指標不可變。
結論:所以我們可以簡單記下這個規則,const 直接修飾的才是唯讀的,不可變的,
對於const int *x 和 int const *x,const直接修飾的應該是」整型「,所以,這個整數不可變,但是這個指標可變。
對於int * const x,const直接修飾的應該是」指標x「,所以,這個指標不可變,但是這個整數可變。
C語言中const的用法
1 const的普通用法 const int n 10 意思很明顯,n是乙個唯讀變數,程式不可以直接修改其值。這裡還有乙個問題需要注意,即如下使用 int a n 在ansi c中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而n只是乙個變數。2 const用於指標 const int p int...
C語言中const的用法
關鍵字const用來定義常量,如果乙個變數被const修飾,那麼它的值就不能再被改變,我想一定有人有這樣的疑問,c語言中不是有 define嗎,幹嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說const的存在一定有它的合理性,與預編譯指令相比,const修飾符有以下的優點 1 預編譯...
C語言中const的用法
const是c語言中的關鍵字,用來定義常變數。1 在使用const時有以下規則 const將變數變為唯讀。只有讀許可權,沒有寫許可權 資料型別對const無影響。如以下兩種定義無區別 int const a 10 不管const是在int前或後,都無影響。const int a 10 都對整形變數a...