C語言(函式)
阿新 • • 發佈:2019-01-24
指標變數
type *p : p是指標變數,型別是type*,用來儲存地址。
type決定了通過這個指標變數訪問記憶體解析記憶體資料的方式。
1 . 訪問記憶體的大小。
2. 記憶體中二進位制資料所解析的型別。
3. 加減法的偏移量p+1。
注意點
- 陣列做形參時 陣列名退化為普通指標
- switch(表示式) int char short
表示式的結果的型別可以是 整數型別,列舉型別,或者類型別(但該類需要有單一的轉換到整數型別或(可以是字元型別,但不能是浮點型別、字串、指標型別等) - 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);
}