日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:清風自在?流水潺潺 ? 更新時間: 2022-06-17 編程語言

一、函數類型

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 = %p\n", pf);
    printf("f = %p\n", f);
    printf("&f = %p\n", &f);
    
    pf();
    
    (*pf)();
    
    printf("Function pointer call: %d\n", 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: %d\n", result);
}
 
int knife(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Knife attack: %d\n", 1);
        ret++;
    }
    
    return ret;
}
 
int sword(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Sword attack: %d\n", 5);
        ret += 5;
    }
    
    return ret;
}
 
int gun(int n)
{
    int ret = 0;
    int i = 0;
    
    for(i=0; i<n; i++)
    {
        printf("Gun attack: %d\n", 10);
        ret += 10;
    }
    
    return ret;
}
 
int main()
{
    fight(knife, 3);
    fight(sword, 4);
    fight(gun, 5);
    
    return 0;
}
 

輸出結果如下:

四、小結

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

原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/123956023

欄目分類
最近更新