C語言中關於const與指標結合的理解

2021-07-14 11:01:08 字數 1344 閱讀 1211

這裡的const要保護的就是資料不能被修改!單獨使用的話,可能就像#define一樣,但是如果是函式引數呢?指標形式的

比如我要把乙個列表裡的內容顯示出來,可能會定義這麼個函式:

typedef struct list

data;

void listshow(data const * data);

這個時候我就可以保證listshow這個函式是無論如何也修改不了我的資料的!這有啥用?很簡單,告訴實現listshow實現的程式設計師(函式宣告和實現的可能,而且極有可能不是乙個人):data裡的資料你不能動!

類似的還有指標不能隨便把指標的內容給該了(改了就找不到東南西北了)

單一函式定義特定的const變數,函式結束,const對應的變數消失(這個我喜歡,要不全域性的巨集用著用著頭就大)

只有被const直接修飾的變數最終指向的內容不可變(忽略變數型別修飾符,即int, long等)。

這裡有兩個要點:一是直接修飾,二是最終指向的內容。

在const int *p中,忽略掉int,被const直接修飾的是*p,*p最終指向指標p指向的位址的內容,所以該內容不可變(至少不可以使用*p進行修改),而變數p沒有被const直接修飾,所以指正變數p最終指向的內容(也就是p本身的值)是可變的。這樣這一句可以等效於int const *p。(這兩種宣告有沒有其他的不同之處,筆者暫時還不清楚)

在int * const p中,指標變數p本const直接修飾,所以p的內容(位址)是不可變的,而p指向的位址的內容(即*p)沒有被const直接修飾,所以p指向的位址的內容是可變的,即*p可以被再賦值。

以上結論是基於以下程式得出的(執行環境: windows 7 家庭普通版,gcc版本:5.1.0, mingw-w64):

#include void main(void)

執行結果如下:

如果將pa,pb,pc統一看成p則有下表:

判斷專案

const int *p=a

int const *p=a

int * const p=a

宣告通過

通過警告

p++通過

通過錯誤

(*p)++

錯誤錯誤

通過其中的警告那項是因為陣列a的定義為const int a[4],標明陣列的內容是被const修飾的,不可變的,而int * const p中,指正p指向的內容可變,前後兩者不一樣,所以報錯。其他結果可按照之前介紹的const修飾理解。

C語言中const與指標的指標

主題源自 c專家程式設計 第19頁,以下是我的理解。先看個例子 include 例子1 void foo1 const char p int main void 這個簡單的程式在編譯的時候會報個error或warning,原因是原型不匹配。為什麼這樣?我們在像下面例子2這樣使用時明明一點問題都沒有。...

C語言中Const指標變數(常指標)

c語言中,指標是最難理解的一部分,尤其是const指標變數。include stdafx.h int main int argc,char argv 定義基本型別的const變數,const 位置在哪兒都可以 const int x 2,y 3 兩個常量 定義乙個非const變數 int z 3 乙...

c語言中關於const的使用

const是c語言中乙個十分重要的修飾 我總結了它的含義使用以及作用如下 1.修飾的資料型別是常型別,常型別的變數或物件的值不能被改變 const int i 10 int a i 等價於int a 10 2.便於進行型別檢查,使編譯對處理內容有更多的了解,消除了一些隱患。3.方便的進行引數的調整和...