這節課作為前幾課的補充擴展,來讓初學者了解更多的C語言的特性。 一個是C語言的預處理(預編譯)命令,一個是動态分配内存,補充上節課的指針。
預處理命令C程序在編譯的階段,一般預先處理一些事情,稱之為預處理或者預編譯階段。這個時候隻對源碼做一些轉換處理,并不涉及内存分配,和編譯階段做的事情完全沒有關聯。合理的使用預處理命令能使程序更加靈活可控,還具備很好的可移植性。
C語言預處理
宏定義
一般在文件的開頭使用宏定義,定義常量也屬于宏定義。宏定義标識符隻做編譯前的源文件字符替換,不參與編譯過程。
條件編譯
顧名思義,條件編譯指源文件中的代碼有條件的參與編譯,不滿足條件不會參與編譯,這與C語言中的if語句有類似的作用,但是有明顯的區别:if語句不管滿不滿足條件都參與編譯,在程序執行過程中去判斷執行;條件編譯則在預編譯階段把不滿足條件的代碼剔除掉,減少了編譯的語句,也就沒有了在程序執行過程中的判斷邏輯。
文件包含
C語言用include來包含文件,即将另一個文件合并到當前文件中,include兩種用法:
預編譯時,遇到尖括号優先去系統目錄查找,遇到雙引号優先去用戶項目目錄查找,所以根據引用的文件來決定使用尖括号還是雙引号,可以節約查找時間,節約預編譯的時間。
動态分配内存void類型指針
先說void類型的指針,這種特殊的指針類型不表示任何數據類型,在使用時根據需要做數據類型的轉換,如:void *p; int *p2 = (int*) p;
C語言void指針
開辟動态内存
使用malloc()函數來申請一段固定長度的内存空間,返回的是一個void指針,在使用的時候可以直接定義一個基礎類型的指針,然後給其賦值,C語言在編譯的時候會自動把void指針轉換為你定義的指針類型,如:int *p = malloc(sizeof(int));
使用calloc()函數來申請n個連續的固定長度的内存空間,定義好之後根據指針的移動,可以輕松傳遞一個數組進去。
重新定義内存
使用realloc()函數來為已經申請内存的指針變量重新分配内存空間。先看如下示例:
realloc()函數示例
上面代碼中,由于對p2做了運算(p2 ),所以在重新分配内存的時候要把p2的指針指向初始位置,即p2-3的位置。對于realloc()的使用總結一下幾點:
釋放内存
使用free()函數釋放上面三個函數申請的内存空間,和realloc()一樣,需要保證指針地址指向内存空間的初始值。
總結預處理命令在第三版有章節介紹,而第五版删除了,但是我們要知道有這個東西,能讀懂别人的代碼,因為這種預處理命令在C語言中很常見。
關于指針要多練習,使用時要小心,結合動态分配内存去理解并加以運用。有任何疑惑的地方,最好的方法還是借助于Visual Studio去驗證自己的理解和想法,遇到搞不懂的地方多去網上搜尋資料,要有刨根問底的勁兒!
往期文章一起學《C程序設計》第八課——指針
一起學《C程序設計》第七課——函數及實戰練習
一起學《C程序設計》第六課——數組、字符串及實戰練習
一起學《C程序設計》第五課——循環控制及實戰練習
一起學《C程序設計》第四課——if語句、switch語句及實戰練習
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!