c語言中,關鍵字一共有32個,其中尤其要注意的是sizeof是關鍵字,不是函式。以下分別對各個關鍵字進行學習。
首先,我們要弄明白以下兩個概念——定義和宣告。
定義:就是建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。乙個變數或物件在一定的區域內(比如函式內,全域性等)只能被定義一次,如果定義多次,編譯器會提示你重複定義同乙個變數或物件。
宣告:有兩重含義
第一重含義:告訴編譯器,該名字已經匹配到一塊記憶體上了,下面的**用到該變數或物件是在別的地方定義的,宣告可以出現多次。
第二重含義:告訴編譯器,該名字已先預定了,在別的地方再也不能用它來作為變數名或物件名,
例如:
a)int i;——定義
b)extern int i;——宣告
注:定義和宣告的最重要的區別:定義建立了物件並為這個物件分配了記憶體,宣告沒有分配記憶體。
宣告自動變數,預設時編譯器一般預設為auto.
在實際程式設計中,可以當它不存在,編譯器在預設的預設情況下,所有變數都是auto的。所以如下兩段**的意義是一樣的。
**一:
#include int g_var = 1000;
int main()
system("pause");
return 0;
}
**二:
#include int g_var = 1000;
int main()
system("pause");
return 0;
}
此處注意:全域性變數不能為auto型,可以為extern或static,區域性變數可以是auto,register,或static型
這個關鍵字請求編譯器盡可能的將變數存在cpu內部暫存器中而不是通過記憶體定址訪問以提高效率,注意,此處是盡可能,而不是絕對,因為cpu的暫存器數目是有限的,當定義了很多個register變數後,不可能把所有的變數都存在暫存器中!
使用register修飾符需要注意:
a)register變數必須是能被cpu暫存器所接受的型別,意味著register變數必須是乙個單個的值,並且其長度應小於或等於整型的長度。
b)register變數由於可能不存放在記憶體中,所以不能用取位址運算子「&」來獲取register變數的位址。
在c語言中,該關鍵字主要有如下兩個作用,
一是用來修飾變數
變數分為區域性變數和全域性變數,它們都存在記憶體靜態區。
靜態全域性變數:其作用域僅限於變數被定義的檔案中,即使在其他檔案中使用extern宣告也沒法使用它,更加準確的說,其作用域是從定義之處開始,到檔案結尾處結束。在定義之處前面的那些**行也不能使用它,對於這種情況下,想要使用就得在前面再加extern。
靜態區域性變數:在函式體中定義的,只能在這個函式裡用,同乙個文件中其他函式也用不了。同時由於被static修飾的變數總是存在記憶體的靜態區,所以,當這個函式執行結束後,這個靜態變數的值還是不會被銷毀。
以下給出兩段**
**一:
#include static int j;
void fun1(void)
void fun2(void)
int main()
system("pause");
return 0;
}
輸出為:
i is 1
j is 1
i is 1
j is 1
i is 1
j is 1
i is 1
j is 1
i is 1
j is 1
i is 1
j is 1
**二:
#include static int j;
void fun1(void)
void fun2(void)
int main()
system("pause");
return 0;
}
輸出:
i is 1
j is 1
i is 2
j is 1
i is 3
j is 1
i is 4
j is 1
i is 5
j is 1
從上面的輸出結果可以看出,結果不一樣,這個主要是因為static int i = 0;是對靜態變數i進行初始化的語句,而static int i; i = 0; 是每次呼叫fun1函式時,都對i進行賦值為0,而靜態變數的初始化就只有一次,而賦值可以多次。
二是用來修飾函式
在函式前面加static使函式成為靜態函式,此處「static」的含義不是指其儲存方式,而是指對函式的作用域僅侷限於本檔案(又稱內部函式),當在函式前面加入static後,當不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其他檔案中的函式同名。
sizeof:用來計算物件所佔記憶體空間大小
以下是注意點:
就是sizeof在計算變數所佔空間大小時,括號可以省略,而計算型別大小時不能省略。但是通常情況,我們還是不要省略了括號。
例項**:
#include #includeint main()
以下是一些計算變數記憶體空間的情況:
#include #includevoid fun(int b[100])
int main()
主要內容來自《c語言深度解剖》
C語言學習之關鍵字
在我們講解關鍵字之前,我們先來了解一下宣告跟定義的區別 定義 所謂定義就是 編譯器 建立了乙個物件,並為這一物件分配了記憶體並且給它取了乙個名字,這個名字就是我們經常所說的變數名或者物件名,乙個變數或者物件在一定區域內 比如函式內 全域性等 只能定義一次 宣告 有兩重含義 1 告訴編譯器,這個名字已...
Linu學習(c語言學習之關鍵字)
對於linux的開發而言c語言非常重要,本節學習的是c語言常用的關鍵字以及運算子的操作。什麼是關鍵字?就是編譯器預先定義的有一定意義的字串,在c語言中有32個關鍵字。下面是列舉的一些關鍵字 sizeof 編譯器檢視變數所佔的記憶體大小的工具 return 函式的返回值 資料型別關鍵字 占用的位元組數...
c語言學習筆記 關鍵字
auto 定義變數為區域性變數,在函式中定義變數時預設為auto static 定義靜態區域性變數,使用static修飾的變數將被放置到資料段,為空鏈結 register 告知編譯器將盡可能變數存放到暫存器中,但該關鍵字只是乙個請求,並不能保證執行,linux中就有乙個變數被此關鍵字修飾 gd,被此...