首頁 > 軟體

C語言詳解函數與指標的使用

2022-04-18 16:00:32

一、函數型別

C 語言中的函數有自己特定的型別

函數的型別由返回值,引數型別和引數個數共同決定,如 int add(int i, int j)的型別為 int(int, int)

C 語言中通過 typedef 為函數型別重新命名

typedef type name(parameter list)

typedef int f(int, int);

typedef void p(int);

二、函數指標

函數指標用於指向一個函數

函數名是執行函數體的入口地址

可通過函數型別定義函數指標:FuncType* pointer;

也可以直接定義: type (*pointer)(parameter list);

  • pointer 為函數指標變數名
  • type為所指函數的返回值型別
  • parameter list 為所指函數的引數型別列表

下面看一個函數指標使用的程式碼:

#include <stdio.h>
 
typedef int(FUNC)(int);
 
int test(int i)
{
    return i * i;
}
 
void f()
{
    printf("Call f()...n");
}
 
int main()
{
    FUNC* pt = test;
    void(*pf)() = &f;
    
    printf("pf = %pn", pf);
    printf("f = %pn", f);
    printf("&f = %pn", &f);
    
    pf();
    
    (*pf)();
    
    printf("Function pointer call: %dn", pt(2));
    
    return 0;
}
 

輸出結果如下:

注意:

1.FUNC* pt = test; 是合法的,test 這個函數名代表的是函數的入口地址,

2.對於函數名來說,取不取地址沒有區別,例如上面程式碼中的 FUNC* pt = test; 也可以寫成FUNC* pt = &test;

3.(*pf)(); 相當於 f();

如果我們把void(*pf)() = &f; 改成void(*pf)() = 0x8048400; 直接利用函數指標跳轉到 0x8048400 這個地址來執行,結果照樣也能正常輸出:

面試小問題:如何使用 C 語言直接跳轉到某個固定的地址開始執行?

答案:通過函數指標

三、回撥函數

回撥函數是利用函數指標實現的一種呼叫機制

回撥機制原理

  • 呼叫者不知道具體事件發生時需要呼叫的具體函數
  • 被調函數不知道何時被呼叫,只知道需要完成的任務
  • 當具體事件發生時,呼叫者通過函數指標呼叫具體函數

回撥機制中的呼叫者和被調函數互不依賴

下面看一個回撥函數的使用範例:

#include <stdio.h>
 
typedef int(*Weapon)(int);
 
void fight(Weapon wp, int arg)
{
    int result = 0;
    
    printf("Fight boss!n");
    
    result = wp(arg);
    
    printf("Boss loss: %dn", result);
}
 
int knife(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Knife attack: %dn", 1);
        ret++;
    }
    
    return ret;
}
 
int sword(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Sword attack: %dn", 5);
        ret += 5;
    }
    
    return ret;
}
 
int gun(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Gun attack: %dn", 10);
        ret += 10;
    }
    
    return ret;
}
 
int main()
{
    fight(knife, 3);
    fight(sword, 4);
    fight(gun, 5);
    
    return 0;
}
 

輸出結果如下:

四、小結

  • C 語言中的函數都有特定的型別
  • 可以使用函數型別定義函數指標
  • 函數指標是實現回撥機制的關鍵技術
  • 通過函數指標可以在 C 程式中實現固定地址跳轉

到此這篇關於C語言詳解函數與指標的使用的文章就介紹到這了,更多相關C語言 函數與指標內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com