C語言中的指標常量與常量指標

2021-07-28 19:11:06 字數 3962 閱讀 8471

很多人糾結過這兩個名詞,也有人寫文章區分兩者的區別。其實很簡單,常量指標和指標常量乙個是指標、乙個是常量。

const int *p_var;與

int const *p_var;

的功能是相同的,都是乙個指向整型常量的指標。指標的數值可以修改,但是當前指標指向的量不可修改。該如何去確認p_var的含義呢?我從一片老外寫的文章中學了一招,無論什麼時候,都把*讀作「value of address」就容易了。按照這個方法,這個生命表達的含義應該是:

#include"stdio.h"

const int a = 123;

const int *p_var1= &a;

int const *p_var2= &a;

int main(void)

printf("value of p_var1 is:%p\n",p_var1);

printf("value of p_var2 is:%p\n",p_var2);

printf("value-1:%d\n",*p_var1);

printf("value-2:%d\n",*p_var2);

p_var1 += 1;

p_var2 += 1;

return 0;

編譯執行結果:

e:\workspace\01_程式語言\01_c語言\03_declare>gcc exp_33.c

e:\workspace\01_程式語言\01_c語言\03_declare>a

value of p_var1is: 00404024

value of p_var2is: 00404024

value-1: 123

value-2: 123

從執行得出結論:

1,常量指標兩種定義方式都可以;

2,常量指標可以修改;

上面的**做一下修改,增加對初始指向常量的修改:

#include"stdio.h"

const int a = 123;

const int *p_var1= &a;

int const *p_var2= &a;

int main(void)

printf("value of p_var1 is:%p\n",p_var1);

printf("value of p_var2 is:%p\n",p_var2);

*p_var1 = 234;

printf("value-1:%d\n",*p_var1);

printf("value-2:%d\n",*p_var2);

p_var1 += 1;

p_var2 += 1;

return 0;

編譯結果如下:

e:\workspace\01_程式語言\01_c語言\03_declare>gcc exp_33.c

exp_33.c: infunction 'main':

exp_33.c:12:10:error: assignment of read-only location '*p_var1'

*p_var1 = 234;

從上面的結果可以看出,初始指標指向的位置是常量,不能夠修改。對**進行進一步修改如下:

#include"stdio.h"

const int a = 123;

const int *p_var1= &a;

int const *p_var2= &a;

int main(void)

printf("value of p_var1 is:%p\n",p_var1);

printf("value of p_var2 is:%p\n",p_var2);

p_var1 += 8;

*p_var1 = 234;

printf("value-1:%d\n",*p_var1);

printf("value-2:%d\n",*p_var2);

p_var1 += 1;

p_var2 += 1;

return 0;

編譯:e:\workspace\01_程式語言\01_c語言\03_declare>gcc exp_33.c

exp_33.c: infunction 'main':

exp_33.c:13:10:error: assignment of read-only location '*p_var1'

*p_var1 = 234;

從這裡可以看出,儘管指標修改了,但是其指向的空間依然是不可修改的,否則會引起編譯器報錯。

接下來看看指標常量,再一次分析一下語義:這是乙個指標,但是是乙個不可修改的指標。這樣,聯想常量的定義就可以知道,如果想讓它具有什麼值得化需要在初始化的時候就完成。而箇指標的特點是,本身不能夠修改,但是指向的內容是可以修改的。指標常量的定義宣告方式如下:

首先利用前面的「value ofaddress」方法描述,應該是:value of address 乙個常量指標指向***。如此,

int * const p_var = ***;

寫**如下;

#include"stdio.h"

int a = 123;

const int b = 234;

int *const p_var1= &a;

int *const p_var2= &b;

int main(void)

printf("value at p_var1 is:%d\n",*p_var1);

printf("value at p_var2 is:%d\n",*p_var2);

a += 1;

printf("value at p_var1 is:%d\n",*p_var1);

return 0;

編譯執行:

e:\workspace\01_程式語言\01_c語言\03_declare>gcc exp_34.c

exp_34.c:7:21:warning: initialization discards 'const' qualifier from pointer target type

int *const p_var2 = &b;

e:\workspace\01_程式語言\01_c語言\03_declare>a

value at p_var1is: 123

value at p_var2is: 234

value at p_var1is: 124

雖說是遇到了警告,但是編譯還是通過了而且可以執行。由此,可以得出結論:

指標常量指向的值可以是變數也可以是常量。

再次修改**;

#include"stdio.h"

int a = 123;

const int b = 234;

int *const p_var1= &a;

int *const p_var2 =&b;

int main(void)

p_var1 += 1;

printf("value at p_var1 is:%d\n",*p_var1);

printf("value at p_var2 is:%d\n",*p_var2);

a += 1;

printf("value at p_var1 is:%d\n",*p_var1);

return 0;

編譯:e:\workspace\01_程式語言\01_c語言\03_declare>gcc exp_34.c

exp_34.c:7:21:warning: initialization discards 'const' qualifier from pointer target type

int *const p_var2 = &b;

exp_34.c: infunction 'main':

exp_34.c:11:9:error: assignment of read-only variable 'p_var1'

p_var1 += 1;

這次是直接遇到了錯誤而停止了編譯,可以看出這個指標實際上不可修改的。

C語言中的常量指標與指標常量

1.常量指標與指標常量是c語言中兩個比較容易混淆的概念 1 const char p 2 char const p a 3 char p abc 1 式定義了乙個常量指標,即指向乙個常量的指標,指向的內容是常量,不可修改,放在常量區的,但指標本身可以修改,即 p b 是非法的,p是p指向的常量的第乙...

c語言之常量指標與指標常量

在c c 中用關鍵字const來定義乙個唯讀的變數和物件,它有如下的優點 1.fun const int var 不予許對傳入的引數進行修改,用於保護實參。2.有如有乙個巨集定義,或者類似於靜態變數,const int var2 1573,方便進行修改 3.節省記憶體,const定義只需占用一小塊記...

C 常量指標與指標常量

c 常量指標與指標常量 1.常量指標 形如 int const p 或 const int p,p稱為 常量指標 例1 include using namespace std int main 執行結果 a的值 30 p的值 30 p重新賦值 40 在例1中,可以看到,p可以先宣告再賦值,而且p可以...