c語言功能強大而豐富,還表現在const與指標的結合使用上,對不同的問題,它提供不同的保護,特別有用的是指向常量的指標
可以將指標指向常量,這就意味著不能通過指標修改它所引用的值
int num = 5;const
int limit = 500
;int *pi;
const
int *pci;
pi = # //
指向整數
pci = &limit; //
指向整數常量
#include int main(void)
不能解引指向常量的指標並改變指標所引用的值,但是指標的值不是常量,可以改變指標,指標可以改為引用另乙個整數常量或普通整數
把pci宣告為指向整數常量的指標意味著:
注意:資料型別和const的順序無關緊要,可以互換
const int *pci = int const *pci
指標不可變,但是它指向的資料可變
intnum;
int *const cpi = #
如果將cpi初始化為指向常量limit將產生錯誤,因為cpi指向的資料可以修改,但是常量是不能被修改的
constint limit = 500
;int * const cpi = &limit;
這種型別的指標很少使用,這種指標不能修改,它指向的資料也不能通過它來修改,下面是乙個例子:
constint * const cpci = &limit;
intnum;
const
int * const cpci = #
宣告此類指標的時候必須進行初始化
#include int main(void)
下表總結所討論的四種指標:
指標型別
指標是否可修改
指向指標的資料是否可修改
指向非常量的指標是是
指向常量的指標是否
指向非常量的常量指標否是
指向常量的常量指標否否
下面的例子中,function函式返回乙個指向結構體常量的指標,意味著結構體中的值是唯讀的,限定符很有用,因為它告訴我們一些不能進行的操作
#include#includestructa;
const
struct a * function(void
)int main(void
)
如果我們試圖修改,我們將得到乙個gcc error
int main(void)
error: assignment of read-only location 『*ptr』
如果將值賦值給乙個非結構體常量,我們將得到gcc的警告
int main(void)
warning: assignment discards qualifiers from pointer target type
如果使用型別轉換將可以成功執行
int main(void)
結構體常量指標作為引數
#include#includestructa;
structb;
const
struct a * function(void
) ptr->x = 0
;
return
ptr;
}void do_something(const
struct b *ptr)
int main(void
)
常量指標
將乙個指標指定為常量的,const關鍵字放在"*"的後面,就像上面的do_something()原型可以改寫為下面的形式,所有的都不可以修改,ptr變數通過呼叫傳遞引數初始化,以後就不能修改
void do_something(conststruct b * const ptr);
常量初始化延伸
乙個結構體常量可以像下面這樣初始化:
int main(void)
乙個指向結構體常量的指標可以像下面這樣初始化:
int main(void)
返回常量指標
conststruct a * const function(void);
傳遞指向常量指標的指標
乙個常見傳遞二重指標的原因就是需要修改指標值,看下面的例子:
void fill_in(conststruct a **location)
int main(void
)
再看下面的**,在location前面加上const
void fill_in(conststruct a ** const
location)
解釋如下:
1、結構體是常量的,內容不能修改
2、指向該結構體的指標,通過location指向,*location不是常量,可以修改
3、變數location是常量的,意味著不能被修改
還可以新增乙個const:
void fill_in(conststruct a * const * const
location)
error: assignment of read-only location 『*location』(
由於*location也是常量,所以會得到gcc error)
下面的**不是操作結構體的內容,也不是指向結構體的指標,而是允許函式通過傳遞的引數操作它自身的區域性變數
void make_use_of(conststruct a * const *location)
解釋如下:
1、結構體是常量的,內容不能修改
2、指向該結構體的指標,通過location指向,*location也是常量,不可以修改
3、變數location是非常量,意味著可以被修改
4、區域性變數ptr_a是常量,不可以被修改
4、區域性變數ptr_a不是常量,可以被修改
維基百科
《c和指標》
c語言之常量指標與指標常量
在c c 中用關鍵字const來定義乙個唯讀的變數和物件,它有如下的優點 1.fun const int var 不予許對傳入的引數進行修改,用於保護實參。2.有如有乙個巨集定義,或者類似於靜態變數,const int var2 1573,方便進行修改 3.節省記憶體,const定義只需占用一小塊記...
C語言常量與指標
c語言功能強大而豐富,還表現在const與指標的結合使用上,對不同的問題,它提供不同的保護,特別有用的是指向常量的指標 可以將指標指向常量,這就意味著不能通過指標修改它所引用的值 int num 5 const int limit 500 int pi const int pci pi 指向整數 p...
C語言中的常量指標與指標常量
1.常量指標與指標常量是c語言中兩個比較容易混淆的概念 1 const char p 2 char const p a 3 char p abc 1 式定義了乙個常量指標,即指向乙個常量的指標,指向的內容是常量,不可修改,放在常量區的,但指標本身可以修改,即 p b 是非法的,p是p指向的常量的第乙...