C語言常量與指標

2022-02-18 19:33:42 字數 3413 閱讀 7290

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

指標不可變,但是它指向的資料可變

int

num;

int *const cpi = #

如果將cpi初始化為指向常量limit將產生錯誤,因為cpi指向的資料可以修改,但是常量是不能被修改的

const

int limit = 500

;int * const cpi = &limit;

這種型別的指標很少使用,這種指標不能修改,它指向的資料也不能通過它來修改,下面是乙個例子:

const

int * const cpci = &limit;

int

num;

const

int * const cpci = #

宣告此類指標的時候必須進行初始化

#include int main(void

)

下表總結所討論的四種指標:

指標型別

指標是否可修改

指向指標的資料是否可修改

指向非常量的指標是是

指向常量的指標是否

指向非常量的常量指標否是

指向常量的常量指標否否

下面的例子中,function函式返回乙個指向結構體常量的指標,意味著結構體中的值是唯讀的,限定符很有用,因為它告訴我們一些不能進行的操作

#include#include

structa;

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#include

structa;

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(const

struct b * const ptr);

常量初始化延伸

乙個結構體常量可以像下面這樣初始化:

int main(void

)

乙個指向結構體常量的指標可以像下面這樣初始化:

int main(void

)

返回常量指標

const

struct a * const function(void);

傳遞指向常量指標的指標

乙個常見傳遞二重指標的原因就是需要修改指標值,看下面的例子:

void fill_in(const

struct a **location)

int main(void

)

再看下面的**,在location前面加上const

void fill_in(const

struct a ** const

location)

解釋如下:

1、結構體是常量的,內容不能修改

2、指向該結構體的指標,通過location指向,*location不是常量,可以修改

3、變數location是常量的,意味著不能被修改

還可以新增乙個const:

void fill_in(const

struct a * const * const

location)

error: assignment of read-only location 『*location』(

由於*location也是常量,所以會得到gcc error)

下面的**不是操作結構體的內容,也不是指向結構體的指標,而是允許函式通過傳遞的引數操作它自身的區域性變數

void make_use_of(const

struct 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指向的常量的第乙...