C語言之const與static的用法

2021-06-27 15:59:11 字數 1494 閱讀 8726

意即其所修飾

的物件為常量(immutable)。

const有幾種用法,當他修飾變數時表明這個變數是唯讀的,但並不是不能修改的,還是可以通過一些方法修改,在本文結尾可以**下修改的方法

1,const的普通用法

const int n=10;  

//這裡注意到,const在應用時必須初始化,否則是不合法的

這裡很明顯,n為唯讀變數,也可以叫做變數常量,不過其本質是在全域性資料段或者堆疊中定義的唯讀常量,不是真正在字串常量區

2.const修飾指標

const int *p ;

int const *p;   //上面這兩種情況是修飾指標所指向的資料,即(*p)是唯讀的

int * const p;  //這種情況是修飾指標變數的,即(p)是唯讀的

記住這個的想技巧,以「*」為分界線,const在其左邊時為修飾指標所指向的變數,在右邊時是修飾指標變數的。

3.const最有用的用法----函式位址傳遞引數

void foo(const  

int *p);

a,這裡相當於函式呼叫者聲稱「我給你乙個指向她的指標,但你不能去修改它」

b。用於限定函式的形參,這樣該函式將不會修改實參指標所指向的資料;

static作用:「改變生命週期」 或者 「改變作用域」

程式的區域性變數存在於(堆疊)中,全域性變數存在於(靜態區 )中,動態申請資料存在於( 堆)中。

1.作用於變數:

用static宣告區域性變數-------區域性變數指在**塊{}內部定義的變數,只在**塊內部有效(作用域),其預設的儲存方式是自動變數或說是動態儲存的,即指令執行到變數定義處時才給變數分配儲存單元,跳出**塊時釋放記憶體單元(生命期)。用static宣告區域性變數時,則改變變數的儲存方式(生命期),使變數成為靜態的區域性變數,

即編譯時就為變數分配記憶體,直到程式退出才釋放儲存單元

。這樣,使得該區域性變數有

記憶功能

,可以記憶上次的資料,不過由於仍是區域性變數,因而只能在**塊內部使用(作用域不變)。

用static宣告外部變數-------外部變數指在所有**塊{}之外定義的變數,它預設為靜態變數,編譯時分配記憶體,程式結束時釋放記憶體單元。同時其作用域很廣,整個檔案都有效甚至別的檔案也能引用它。為了限制某些外部變數的作用域,使其只在本檔案中有效,而不能被其他檔案引用,可以用static關鍵字對其作出宣告。

總結:用static宣告區域性變數,使其變為靜態儲存方式(靜態資料區),作用域不變;用static宣告外部變數,其本身就是靜態變數,這只會改變其連線方式,使其只在本檔案內部有效,而其他檔案不可連線或引用該變數。

對於修改const定於的變數,網上解釋用指標指向他,然後對其進行修改

程式如下

#include

#include

int main()

輸出為:6 6  

說明通過指標還是能修改其值的

C語言之旅(4)const

在c語言中,const宣告的變數是唯讀變數,並不等同於常量。const和define的區別是什麼?1.對於define巨集,在c語言中是單純的替換。在預編譯階段就是完成全量替換操作,並不檢查對錯。2.而const,程式在編譯的時候會檢查const的型別,如果不對的話,編譯會報錯。3.const可以保...

C語言之const常量(摘自C和指標)

c語言中我們可以使用const和define關鍵字宣告常量,所謂常量就是指值不能修改的量。如下面的例子所示 int const a const int a 這兩條語句都把a宣告為乙個常量 整數 它的值不能被修改。由於常量的值無法被修改,所以不能用任何其他東賦值給它,如此一來,怎樣使它在一開始就擁有乙...

C語言之const關鍵字總結

同樣都可以定義常量,const與 define相比有什麼不同?1.const常量有資料型別,而巨集常量沒有資料型別。2.編譯器可以對常量進行型別安全檢查,而巨集只進行字元替換,沒有安全檢查,而且在字元替換對過程中可以發生意想不到對錯誤 邊界效應 define n 2 3 double a n 2 我...