1. 程式人生 > >C語言(函式)

C語言(函式)

指標變數

type *p : p是指標變數,型別是type*,用來儲存地址。
type決定了通過這個指標變數訪問記憶體解析記憶體資料的方式。
1 . 訪問記憶體的大小。
2. 記憶體中二進位制資料所解析的型別。
3. 加減法的偏移量p+1。

注意點

  1. 陣列做形參時 陣列名退化為普通指標
  2. switch(表示式) int char short
    表示式的結果的型別可以是 整數型別,列舉型別,或者類型別(但該類需要有單一的轉換到整數型別或(可以是字元型別,但不能是浮點型別、字串、指標型別等)
  3. static
    • 修飾區域性變數:讓區域性變數的生存週期變為全域性的。
    • 修飾全域性變數:讓全域性變數只能在本檔案中使用
    • 修飾函式:讓函式只能在本檔案中使用。

函式呼叫過程

  • 我們把呼叫其他函式的函式稱為主調函式(主函式),把被呼叫的函式稱為被調函式(子函式),那麼函式的呼叫流程如下:
    ① 按順序執行主調函式中的語句,直到呼叫被調函式前的語句為止;
    ② 跳轉到被調函式中執行,一直到被調函式正常結束,或是呼叫return 返回;
    ③ 返回主調函式中,從被調函式後的第一個語句開始繼續開始執行。

  • 每個函式被呼叫時都有自己的棧空間,這塊棧空間是私有的,只歸本函式使用,用於儲存引數和區域性變數。當函式呼叫結束(程式碼結束或是遇到return 語句)時,這塊棧空間會被編譯器自動回收,儲存在上面的資料將不能再被使用。

函式的宣告

當函式的定義出現在呼叫之前時,函式可以正常呼叫。而當函式的定義出現在呼叫之後時,函式的呼叫就會出現無法識別的問題(GCC 編譯器需要新增 -Wall 選項才可以看到錯誤提示資訊)。

指標型別的返回值

對於指標型別的返回值,有一點要非常注意,不可以返回指向棧記憶體的指標,因為棧空間在函式返回後就已經被回收了。

遞迴函式

函式可以呼叫自己呼叫自己,函式自己呼叫自己稱為函式的遞迴。函式遞迴尤其要注意的一點是,遞迴需要有一個終止條件,否則函式一直遞迴下去,棧空間終會被消耗完,導致程式的段錯誤。

  • 不使用任何變數求字串長度
int my_strlen(char
*str) { if(*str == ‘\0’) { return 0; } else { return (1 + my_strlen(++str)); } }
  • 遞迴列印十進位制數的n進位制(二進位制舉例)
#define SCALE 2
void base_conversion(int num)
{
    if(num < SCALE)
    {
        printf("%d", num);
        return;
    }
    else
    {
        base_conversion(num / SCALE);
        printf("%d", num % SCALE);
    }
}

函式指標

  • 每個函式在經過編譯後最終都會形成一段二進位制程式碼,而這些程式碼在程式執行時也會載入記憶體,所以每個函式都會在記憶體中有一個儲存的地址,通過改地址便可呼叫函式。
  • 函式的地址就是函式名,這點與陣列類似。
int add(int a , int b)
{
    return a + b;
}

int (*padd)(int a, int b); //定義函式指標
padd = add; //給函式指標賦值
padd(3, 2); //通過函式指標呼叫函式

回撥函式

如果某個函式的引數中帶有函式指標,那麼我們稱這個函式為回撥函式。同樣可以完成對函式的呼叫。

int add(int a, int b)
{
    return a + b;
}
int callback(int num1, int num2, int (*pfun)(int, int)) //回撥函式
{
    return pfun(num1, num2);
}

字串處理函式