很多人糾結過這兩個名詞,也有人寫文章區分兩者的區別。其實很簡單,常量指標和指標常量乙個是指標、乙個是常量。
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可以...