基本修飾符

2021-07-05 03:26:45 字數 2543 閱讀 8658

const是乙個c語言的關鍵字,它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。。 —— [ 百科 ]

int const *a,int *const a,const int *a

const 屬於修飾符 ,關鍵是看const 修飾的位置在那裡。

1、int const *a,這裡的const修飾的是*a,即指標所指向的值是固定不變的,它和const int *a的效果是一樣的。

2、int *const a, const修飾的是a,說明指標的位址不可以變,而指標指向的值可以變。

3、const *int const a, 說明既不能修改指標的位址,也不能修改指向的值。

eg:

const int *a = 0;

int *const m;

const int b = 1;

int c = 1;

a = &b //ok! 額外:注意不能通過a 來修改 b值

a = &c //ok! 額外:雖然c本身不是乙個常量

*a = 2 //erro! 為題就在這裡,不能修改通過 *a 所指向的物件值,最後賦值得物件是c,因此不能通過*a 來修改c值。

*m = b; //ok! 不能修改位址m

關於const的點滴補充:

1、const 物件的位址只能賦值給指向const 物件的指標

2、指向const 物件的指標可以 被賦 以 乙個非const 物件的位址

3、指向const 得指標常被用作函式的形式引數,保證被傳遞給函式的實際物件在函式得實際物件在函式中不會被修改

4、常量在定義後就不能被修改,所以它必須被初始化。未初始化的常量定義將導致編譯錯誤(上面都是在說明const得問題,所以沒有賦值,實際語句中要賦 值的)

1、static 最重要的乙個作用就是隱藏。當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,如下:

char a = 'a'; // global variable

void msg()

int main(void)

程式的執行結果是:

a hello

你可能會問:為什麼在a.c中定義的全域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。此例中,a是全域性變數,msg是函式,並且都沒有加static字首,因此對於另外的原始檔main.c是可見的。

如果加了static,就會對其它原始檔隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏,而對於變數,static還有下面兩個作用.

2、static的第二個作用是保持變數內容的持久。儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍,說到底static還是用來隱藏的。如:

#include 

int fun(void)

intcount = 1;

int main(void)

程式的執行結果是:

global local static

1,10 | 2,9 | 3,8 | 4,7 | 5,6 | 6,5 | 7,4 | 8,3 | 9,2 | 10,1|

3、static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00,某些時候這一特點可以減少程式設計師的工作量。比如初始化乙個稀疏矩陣,我們可以乙個乙個地把所有元素都置0,然後把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把乙個字元陣列當字串來用,但又覺得每次在字元陣列末尾加』\0』太麻煩。如果把字串定義成靜態的,就省去了這個麻煩,因為那裡本來就是』\0。

定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

1) 並行裝置的硬體暫存器(如:狀態暫存器)

2) 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)

3) 多執行緒應用中被幾個任務共享的變數

int square(volatile int

*ptr)

由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不是你所期望的平方值!正確的**如下:

long square(volatile int *ptr) 

修飾符 許可權修飾符

四種形式許可權修飾符的訪問情況 publicprotected不寫private 同乙個類中 四種都可以 同一包中的不同類 除了private剩下都可以 不同包下的子類 public protected 可以 不同包下的不同類 只有public可以 許可權修飾符 public protected 預...

C 修飾符 類修飾符和成員修飾符

c 修飾符之類修飾符 public internal partial abstract sealed static internal 本程式集內的成員可以訪問。partial 部分類,可以將乙個類分成幾部分寫在不同檔案中,最終編譯時將合併成乙個檔案,且各個部分不能分散在不同程式集中。c 修飾符之成員...

java修飾符 abstract 修飾符

abstract 修飾符 abstract 修飾符可以用來修飾類和成員方法 用 abstract 修飾的類表示抽象類,抽象類位於繼承樹的抽象層,抽象類不能被例項化,即不允許建立抽象類本身的例項。沒有用 abstract 修飾的類稱為具體類,具體類可以被例項化。用 abstract 修飾的方法表示抽象...