C儲存類,鏈結和記憶體管理學習總結和心得

2021-07-09 22:03:04 字數 2028 閱讀 5938

c有

5儲存類                         時期    作用域    鏈結       宣告方式

自動                             自動    **塊     空        **塊內

暫存器                         自動    **塊     空        **塊內,使用關鍵字register

具有外部鏈結的靜態    靜態     檔案     外部       所有函式之外

具有內部鏈結的靜態    靜態     檔案     內部       所有函式之外,使用關鍵字static

空鏈結的靜態               靜態     檔案       空        **塊內,使用關鍵字static

解釋一些關鍵字:

aotu型別表示該變數的存在時間由函式呼叫決定,且定義變數時預設使用

aotu

型別extern關鍵字宣告表示該變數由外部宣告定義,且在此處引用,若引用其他檔案定義的變數則必須要使用

extern

關鍵字static表示該變數是靜態的,即與整個程式的生存週期相同,同時,

static

型的變數在編譯程式之前進行編譯,即除了

#提示的預編譯內容外,

static

內容編譯的優先順序最高,這樣造成的特性就是在程式中被

static

提示的內容不會被重複定義宣告,這在函式的遞迴中很重要。

register表示該變數被放置在暫存器或者較快的記憶體中,這樣的變數可以對程式的執行速度造成一定的優化,然而由於暫存器的特殊性,被該關鍵字標註的變數無法獲得其位址,所以不能對其使用指標(即使該變數被放在了記憶體中)。

const不做解釋。。。。。。。

volatile告訴編譯器這是乙個易變的變數,即可能被除了使用者執行的程式之外的**所更改,這類變數由於可能會在一些未知的情況下被修改,所以如果對其進行執行優化會產生錯誤的計算結果,如硬體的時鐘等。反過來,非

volatile

變數即代表該變數的所有呼叫和變化都被程式所監控,因此編譯器可以對其進行適當的計算優化。

restricted只可被用於指標,並表明指標是放棄乙個資料物件的唯一且初始的方式,從結果上來說,這樣的限定可以使程式的執行更加安全,但可能會使程式的編寫變得更加麻煩。

c中還有乙個不太常用的作用域被稱為函式作用域,這些標記與

goto

聯用,作為跳轉的標記,不過由於

goto

的危害性,這個作用域的存在感如同阿卡林一般

............

寫一些總結:

沒有在**塊內定義而具有全域性作用域的儲存類或宣告方式

c程式編譯的順序:預編譯

->main

外部宣告和

static

變數->main

extern更像是鏈結的關鍵字,而不是宣告,準確的說

extern

其實是引用宣告的關鍵字。

向函式傳遞資料的方法不僅可以使用傳值呼叫,也可以用全域性變數,儘管這種方式並不推薦

在多檔案編譯中,使用static

關鍵字修飾變數,使變數在編譯

main

前完成定義宣告,這樣就可以不用擔心多檔案中的重複宣告了。

使用全域性變數會造成不必要的風險,因為全域性變數會被各個函式所修改,所以使用全域性變數時最好使用const

關鍵字修飾,使其變為常量。不過既然這麼麻煩為什麼不用

define?

malloc()和free()是c

進行記憶體管理的基礎,也是

c的高階資料結構的基礎,如鍊表等。與

malloc

相似的還有

calloc(),其實並沒有什麼太大的區別,除了自動進行了元素初始化。只是多了這麼乙個功能就要多寫乙個庫函式.........

不嫌麻煩麼

............

多樣性的儲存類使c

優化乙個程式的方法變得十分豐富,不過既然

c現在只是用來寫底層的東西,那有必要計較這一點執行速度嗎

.............

c記憶體管理學習總結

1.c中分配記憶體有malloc 和calloc 函式,它們返回乙個位址指標,malloc 函式使用如下 double ptd ptd double malloc 30 sizeof double 這段 請求30個double型別值的空間,並把ptd指向該空間所在位置。calloc 函式使用如下 l...

記憶體管理學習筆記

1.棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數 包括全域性靜態變數和區域性靜態變數 靜態區的內容在整個程式的生命週期內都存在。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但是空間大小有限。堆 由malloc系列函式或n...

cocos記憶體管理學習

口訣 1.誰建立,誰釋放。通過new或者clone建立的物件,必須呼叫release或者autorelease。2.new,clone以外的方法建立的物件都被宣告了autorelease。3.誰retain,誰release。無論這個物件是如何生成的,只要呼叫了retain就要呼叫release。正...