C語言學習之關鍵字 1

2021-09-30 14:48:14 字數 2900 閱讀 6996

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,被此...