c語言的知識點

2021-07-11 07:17:47 字數 1474 閱讀 2096

1.getchar()的返回值是int

int c;

while((c=getchar())!=eof)

putchar(c);

在while迴圈中以eof作為檔案結束標誌,這種以eof作為檔案結束標誌的檔案,必須是文字檔案。在文字檔案中,資料都是以字元的ascii**值的形式存放。我們知道,ascii**值的範圍是0~255,不可能出現-1,因此可以用eof作為檔案結束標誌。

2.eof的作用

eof的作用也可以總結為:當終端有字元輸入時,ctrl+d產生的eof相當於結束本行的輸入,將引起getchar()新一輪的輸入;當終端沒有字元 輸入或者可以說當getchar()讀取新的一次輸入時,輸入ctrl+d,此時產生的eof相當於檔案結束符,程式將結束getchar()的執行。 3.

c程式的記憶體布局

3.4 棧和堆的區別

前面已經介紹過,棧是由編譯器在需要時分配的,不需要時自動清除的變數儲存區。裡面的變數通常是區域性變數、函式引數等。堆是由malloc()函式(c++語言為new運算子)分配的記憶體塊,記憶體釋放由程式設計師手動控制,在c語言為free函式完成(c++中為delete)。棧和堆的主要區別有以下幾點:

(1)管理方式不同。

棧編譯器自動管理,無需程式設計師手工控制;而堆空間的申請釋放工作由程式設計師控制,容易產生記憶體洩漏。

(2)空間大小不同。

棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,當申請的空間超過棧的剩餘空間時,將提示溢位。因此,使用者能從棧獲得的空間較小。

堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。因為系統是用鍊錶來儲存空閒記憶體位址的,且鍊錶的遍歷方向是由低位址向高位址。由此可見,堆獲得的空間較靈活,也較大。棧中元素都是一一對應的,不會存在乙個記憶體塊從棧中間彈出的情況。

(3)是否產生碎片。

對於堆來講,頻繁的malloc/free(new/delete)勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低(雖然程式在退出後作業系統會對記憶體進行**管理)。對於棧來講,則不會存在這個問題。

(4)增長方向不同。

堆的增長方向是向上的,即向著記憶體位址增加的方向;棧的增長方向是向下的,即向著記憶體位址減小的方向。

(5)分配方式不同。

堆都是程式中由malloc()函式動態申請分配並由free()函式釋放的;棧的分配和釋放是由編譯器完成的,棧的動態分配由alloca()函式完成,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行申請和釋放的,無需手工實現。

(6)分配效率不同。

棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行。堆則是c函式庫提供的,它的機制很複雜,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在堆記憶體中搜尋可用的足夠大的空間,如果沒有足夠大的空間(可能是由於記憶體碎片太多),就有需要作業系統來重新整理記憶體空間,這樣就有機會分到足夠大小的記憶體,然後返回。顯然,堆的效率比棧要低得多。

c語言 知識點

遞迴方法 遞迴相比迴圈時間上快些,但是 遞迴比較占用空間,如果遞迴的次數超過十萬次後會導致資源占用完畢 標準的 優化技巧 消除迴圈 函式迴圈 函式 就地擴充套件 公共子表示式消除 改進暫存器分配 省略執行時對陣列邊界的檢查 迴圈不變數 移動 操作符長度消減 把指數操作符轉變為乘法操作 把乘法操作變為...

c語言知識點

2019 3 4 typedef void voidp 等同於typedef void voidp voidp a a null 即定義了乙個可以指向任何型別的指標 typedef voidpf zallback open file func of voidpf opeaque,const char...

c語言知識點

關於 va args define debug level,format,if level g printlevel else 這裡的 va args 表示可變引數,即上面.傳遞進來的多個引數,是當傳入引數為0時,去掉前面,防止編譯出錯 的另乙個用法如 define xname n x n,那xna...