/*
1,關鍵字的總結
register:
(1),這個關鍵字請求編譯器盡可能的將變數存在cpu內部暫存器中,而不是通過記憶體定址訪問,以提高效率。
const:
(1),const修飾變數,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的型別為type的變數value是不可變的。
type const valuename = value;
const type valuename = value;
(2),將const改為外部連線,作用於擴大至全域性,編譯時會分配記憶體,並且可以不進行初始化,僅僅作為宣告,編譯器認為在程式其他地方進行了定義.
extend const int valuename = value;
(3),const建立的全域性變數不能修改,const建立的臨時變數可以修改:
例如:const int n=10;
void main()
(9),const 修飾函式返回值
const修飾函式返回值其實用的並不是很多,它的含義和const修飾普通變數以及指標的含義基本相同。
a.const int fun1() //這個其實無意義,因為引數返回本身就是賦值。
b. const int * fun2() //呼叫時 const int *pvalue = fun2();
//我們可以把fun2()看作成乙個變數,即指標內容不可變。
c.int* const fun3() //呼叫時 int * const pvalue = fun2();
//我們可以把fun2()看作成乙個變數,即指標本身不可變。
3,static:
c語言中:
(1)在c語言中,static可以用來修飾區域性變數,全域性變數以及函式。在不同的情況下static的作用不盡相同。
(2)修飾區域性變數
一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式執行結束。但是在這裡要注意的是,雖然用static對區域性變數進行修飾過後,其生命週期以及儲存空間發生了變化,但是其作用域並沒有改變,其仍然是乙個區域性變數,作用域僅限於該語句塊。
在用static修飾區域性變數後,該變數只在初次執行時進行初始化工作,且只進行一次。
如:#include
void fun()
int main(void)
程式執行結果為: 2 3
說明在第二次呼叫fun()函式時,a的值為2,並且沒有進行初始化賦值,直接進行自運算,所以得到的結果為3.
對於靜態區域性變數如果沒有進行初始化的話,對於整形變數系統會自動對其賦值為0,對於字元陣列,會自動賦值為'\0'.
(3)修飾全域性變數
對於乙個全域性變數,它既可以在本原始檔中被訪問到,也可以在同乙個工程的其它原始檔中被訪問(只需用extern進行宣告即可)。
如: int a=1;
file2.c
#include
extern int a;
int main(void)
則執行結果為 1
但是如果在file1.c中把int a=1改為static int a=1;
那麼在file2.c是無法訪問到變數a的。原因在於用static對全域性變數進行修飾改變了其作用域的範圍,由原來的整個工程可見變為本原始檔可見。
(3)修飾函式
用static修飾函式的話,情況與修飾全域性變數大同小異,就是改變了函式的作用域。
c++中:
在c++中static還具有其它功能,如果在c++中對類中的某個函式用static進行修飾,則表示該函式屬於乙個類而不是屬於此類的任何特定物件;如果對類中的某個變數進行static修飾,表示該變數為類以及其所有的物件所有。它們在儲存空間中都只存在乙個副本。可以通過類和物件去呼叫。
4,volatile:
(1),volatile int const n=10;
編譯器不會對n進行優化,
volatile int i=10;
int j = i;
...int k = i;volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中
建議使用volatile變數的場所:
(1) 並行裝置的硬體暫存器
(2) 乙個中斷服務子程式中會訪問到的非自動變數(全域性變數)
(3) 多執行緒應用中被幾個任務共享的變數
5.typedef:
(1),typedef可以對程式進行一定的優化,例如
定義結構體:
struct stu
定義乙個新的物件為:struct stu stu1;
如果使用typedef:
則:typedef struct stu stu;
可以:stu stu1;
(2);可以定義乙個函式指標:
typedef int(*pfun)(int a,int b,int c)
則*pfun 就是乙個函式指標:
6,define:
(1).簡單的define定義
#define maxtime 1000
乙個簡單的maxtime就定義好了,它代表1000,如果在程式裡面寫
編譯器在處理這個**之前會對maxtime進行處理替換為1000。
這樣的定義看起來類似於普通的常量定義const,但也有著不同,因為define的定義更像是簡單的文字替換,
(2),define可以像函式那樣接受一些引數,如下
#define max(x,y) (x)>(y)?(x):(y);
這個定義就將返回兩個數中較大的那個,看到了嗎?因為這個「函式」沒有型別檢查,就好像乙個函式模板似的,當然,它絕對沒有模板那麼安全就是了。可以作為乙個簡單的模板來使用而已。
(3).在大規模的開發過程中,特別是跨平台和系統的軟體裡,define最重要的功能是條件編譯。
就是:#ifdef windows
......
......
#endif
#ifdef linux
......
......
#endif
(4),5.如何定義巨集、取消巨集
//定義巨集
#define [macroname] [macrovalue]
//取消巨集
#undef [macroname]
//普通巨集
#define pi (3.1415926)
帶引數的巨集
#define max(a,b) ((a)>(b)? (a),(b))
(5),防止乙個標頭檔案被重複包含
#ifndef comdef_h
#define comdef_h
//標頭檔案內容
#endif
*/
關鍵字的用法 C 中const關鍵字用法總結
ark2000 看完了c primer的基礎篇,對const還是有點陌生,在這裡小小地總結一下吧。在變數的定義前加上const修飾符即可完成const物件的建立。const int val 5 const變數的值不能改變。val 5 error assignment of read only var...
C 關鍵字總結
const 與define define是預編譯器的編譯指令,它從c語言相容下來,工作方式與文字編輯器中的全域性搜尋和替換相似。define定義的常量的意義在它開始的地方持續到檔案結束,在預編譯階段,預編譯器已經將所有define刪除,並展開所有的巨集定義。它單純只做文字替換,沒有型別安全檢查,de...
C 中static關鍵字的用法總結
1.全域性靜態變數 在全域性變數前加上關鍵字static,全域性變數就定義成乙個全域性靜態變數,這 改變了它的作用域 未加static字首的全域性變數和函式預設省略 extern,都具有全域性可見性 儲存及生命週期 在靜態儲存區,整個程式執行期間一直存在。初始化 未經初始化的全域性靜態變數是會被自動...