C語言深度解剖學習(一)

2021-08-27 00:25:09 字數 1783 閱讀 5658

c語言關鍵字有32個,其中比較特殊的是sizeof,sizeof是關鍵字,而不是函式。

c語言中定義與宣告的區別

定義:就是(編譯器)建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和這塊記憶體匹配起來(可以想象是這個名字嫁給了這塊空間,)它們就同生共死,終生不離不棄。並且這塊記憶體的位置也不能改變。乙個變數或物件在一定的區域內(比如函式內,全域性等)只能被定義一次,如果定義多次,編譯器會提示你重複定義同乙個變數或物件。

宣告:有兩重含義,

第一重含義:告訴編譯器,這個名字已經匹配到一塊記憶體上,下面的**用到變數或物件是在別的地方定義的。宣告可以出現多次。

第二重含義:告訴編譯器,我這個名字我先預定了,別的地方再也不能用它來作為變數名或物件名。

例如:int i; //宣告

extern int i; //定義

定義與宣告最重要的區別:定義建立了物件並為這個物件分配了記憶體,宣告沒有分配記憶體。

1.關鍵字auto

編譯器在預設的預設情況下,所有變數都是auto的

2.關鍵字register

這個關鍵字請求編譯器盡可能的將變數存在cpu內部暫存器中而不是通過記憶體定址訪問以提高效率。

注:此處是盡可能,而不是絕對。因為乙個cpu的暫存器也就那麼幾個。要是定義了很多很多的register變數,它累死也可能不能全部把這些變數放入暫存器吧。

暫存器:資料從記憶體裡拿出來後先放在暫存器,然後cpu再從暫存器裡讀取資料來處理,處理完後同樣把資料通過暫存器存放到記憶體裡,cpu不直接和記憶體打交道。

cpu一般有很多暫存器,不同型號的cpu擁有暫存器的數量不一樣。

暫存器其實就是一塊一塊小的儲存空間,只不過其訪問速度要比記憶體快得多。

使用register修飾符時需要注意:

使用register修飾符是有些限制的:register變數必須是能被cpu暫存器所接受的型別。以為著register變數必須是乙個單一的值。並且其長度應小或等於正型的長度。

同時register變數可能不存放在記憶體中,所以不能用取位址運算子「&」來獲取register變數的位址。

3.關鍵字static

該關鍵字在c語言裡主要有兩個作用,c++對它進行了擴充套件

1) 修飾變數

變數分為區域性和全域性變數,但它們都存在記憶體的靜態區。

靜態全域性變數,作用域僅限於變數被定義的檔案中,其他檔案即使使用extern宣告也沒法使用它。準確地說作用域是從定義之處開始,到檔案結束處結束,在定義之處前面的那些**行也不能使用它。想要使用就得在前面再加extern ***。這樣就有點複雜了,若想要簡單,直接在檔案頂端定義就可以了。

靜態區域性變數,在函式體裡面定義的。就只能在這個函式裡用,同乙個文件中的其他函式也用不了。由於被static修飾的變數總是存在記憶體的靜態區,所以即使這個函式執行結束,這個靜態變數的值還是不會被銷毀,函式下次使用時仍然能用到這個值。

2) 修飾函式

函式前面加上static使得函式稱為靜態函式。此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案(所以又稱內部函式)。使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其他檔案中的函式同名。

4.關鍵字sizeof

sizeof是關鍵字,不是函式!

記住:sizeof在計算變數所佔空間大小時,括號可以省略,而計算型別大小時不能省略。

例如:int i;

sizeof i; //正確

sizeof int //錯誤

5.關鍵字signed、unsigned

編譯器預設情況下資料為signed型別的。

C語言深度解剖 學習筆記

第一章 關鍵字 1.register 能接受的變數型別,不能用 2.static 靜態區域性變數 對定義該變數的函式來說,一直存在,可用。對外不可用 靜態全域性變數 對本檔案或本模組內的任意函式可用。對外不可用 靜態函式 該函式作用域僅限於本檔案 3.資料型別 大小可以用sizeof測定 命名法則 ...

C語言深度解剖

1.關鍵字 是編譯器能認識的特殊字串符號。c語言共有32個關鍵字,含sizeof,計算物件所佔記憶體空間的大小。2.定義 建立乙個物件並分配一塊記憶體。3.宣告 告訴編譯器,名字已經匹配到了一塊空間,別的地方不能用它來作為變數名或物件名。宣告沒有分配記憶體,可以出現多次宣告。4.區域性變數 也叫自動...

C語言深度解剖

c語言深度解剖 本書目錄結構如下 第一章 關鍵字 1.1 最寬恒大量的關鍵字auto 1.2 最快的關鍵字register 1.3 最不實名的關鍵字static 1.4 基本資料型別 1.5 最冤枉的關鍵字sizeof 1.6 if else組合 1.7 switch case組合 1.8 do w...