C語言中const的正確用法

2022-04-03 04:44:30 字數 2151 閱讀 1040

今天看《linux核心程式設計》(claudia salzberg podriguez等著)時,文中(p39)有乙個錯誤,就是關於const的用法。

原文中舉例說明:const int *x中x是乙個指向const整數的指標,因此可以修改該指標,不可以修改這個整數。而在int const *x中,x卻是乙個指向整數的const指標,因而這個整數可以改變,但是指標不可以改變。本來我也對這個不是很懂,於是就寫了個測試例子測了一下:

測試一,const int *x,**如下:

1

int b = 1,a=3;2

const

int *c = &a;

3 c = &b;

4 printf("

c is %d\n

",*c);

測試結果:c is 1,即,指標可以修改

修改下:

1

int 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 的描述:」

因而這個整數可以改變,但是指標不可以改變「

卻是錯誤的。

測試二:

1

int g = 22;2

intconst *d;

3 d = &g;

4int f = 23

;5 d = &f;

6 printf("

d is %d\n

",*d);

測試結果 d is 23,這個指標是可以改變的!

改一下:

1

int 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應該怎麼定義?

測試三:

1

int 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

改一下:

1

int 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...