tft每日頭條

 > 生活

 > c程序設計圖解

c程序設計圖解

生活 更新时间:2025-01-16 05:01:55

這節課作為前幾課的補充擴展,來讓初學者了解更多的C語言的特性。 一個是C語言的預處理(預編譯)命令,一個是動态分配内存,補充上節課的指針。

預處理命令

C程序在編譯的階段,一般預先處理一些事情,稱之為預處理或者預編譯階段。這個時候隻對源碼做一些轉換處理,并不涉及内存分配,和編譯階段做的事情完全沒有關聯。合理的使用預處理命令能使程序更加靈活可控,還具備很好的可移植性。

c程序設計圖解(一起學C程序設計第九課)1

C語言預處理

宏定義

一般在文件的開頭使用宏定義,定義常量也屬于宏定義。宏定義标識符隻做編譯前的源文件字符替換,不參與編譯過程。

  • 普通宏定義如常量:#define STRING value
  • 可以進行表達式代替值,比如先定義#define A 1之後可以再定義#define B A 1
  • 帶參數的宏定義,#define ADD(x,y) x y,源文件可以ADD(1,2)這樣調用

條件編譯

顧名思義,條件編譯指源文件中的代碼有條件的參與編譯,不滿足條件不會參與編譯,這與C語言中的if語句有類似的作用,但是有明顯的區别:if語句不管滿不滿足條件都參與編譯,在程序執行過程中去判斷執行;條件編譯則在預編譯階段把不滿足條件的代碼剔除掉,減少了編譯的語句,也就沒有了在程序執行過程中的判斷邏輯。

  • #ifdef STRING...#else...#endif,其中else可以省略,如果定義了STRING則執行
  • #ifndef STRING...#else...#endif,與上面相反,如果沒有定義STRING則執行

文件包含

C語言用include來包含文件,即将另一個文件合并到當前文件中,include兩種用法:

  • #include <file>,一般包含的是系統的庫函數頭文件
  • #include "file",一般包含用戶自定義的文件

預編譯時,遇到尖括号優先去系統目錄查找,遇到雙引号優先去用戶項目目錄查找,所以根據引用的文件來決定使用尖括号還是雙引号,可以節約查找時間,節約預編譯的時間。

動态分配内存

void類型指針

先說void類型的指針,這種特殊的指針類型不表示任何數據類型,在使用時根據需要做數據類型的轉換,如:void *p; int *p2 = (int*) p;

c程序設計圖解(一起學C程序設計第九課)2

C語言void指針

開辟動态内存

使用malloc()函數來申請一段固定長度的内存空間,返回的是一個void指針,在使用的時候可以直接定義一個基礎類型的指針,然後給其賦值,C語言在編譯的時候會自動把void指針轉換為你定義的指針類型,如:int *p = malloc(sizeof(int));

使用calloc()函數來申請n個連續的固定長度的内存空間,定義好之後根據指針的移動,可以輕松傳遞一個數組進去。

重新定義内存

使用realloc()函數來為已經申請内存的指針變量重新分配内存空間。先看如下示例:

c程序設計圖解(一起學C程序設計第九課)3

realloc()函數示例

上面代碼中,由于對p2做了運算(p2 ),所以在重新分配内存的時候要把p2的指針指向初始位置,即p2-3的位置。對于realloc()的使用總結一下幾點:

  • 第一個指針參數必須指向已申請内存的首地址
  • 重新分配内存空間後,如果失敗則返回NULL
  • realloc()第一個參數可以是NULL,這樣使用相當于直接開辟新内存空間,和malloc()、calloc()功能一樣
  • realloc()可以“嵌套調用”,也就是已經被重新分配的空間還可以再次重新分配

釋放内存

使用free()函數釋放上面三個函數申請的内存空間,和realloc()一樣,需要保證指針地址指向内存空間的初始值。

總結

預處理命令在第三版有章節介紹,而第五版删除了,但是我們要知道有這個東西,能讀懂别人的代碼,因為這種預處理命令在C語言中很常見。

關于指針要多練習,使用時要小心,結合動态分配内存去理解并加以運用。有任何疑惑的地方,最好的方法還是借助于Visual Studio去驗證自己的理解和想法,遇到搞不懂的地方多去網上搜尋資料,要有刨根問底的勁兒!

往期文章

一起學《C程序設計》第八課——指針

一起學《C程序設計》第七課——函數及實戰練習

一起學《C程序設計》第六課——數組、字符串及實戰練習

一起學《C程序設計》第五課——循環控制及實戰練習

一起學《C程序設計》第四課——if語句、switch語句及實戰練習

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved