c語言深度剖析(36)—函數與指針分析

1.函數類型 

  • C語言中的函數有自己特定的類型 
  • 函數的類型由返回值,參數類型和參數個數共同決定 
    • int add(int i, int j) 的類型爲 int (int, int) 
  • C語言中通過typedef爲函數類型重命名 
    • typedef type name(parameter list)

2.函數指針

  • 函數指針用於指向—個函數 
  • 函數名是執行函數體的入口地址 
  • 可通過函數類型定義函數指針: FuncType* pointer; 
  • 也可以直接定義:type (調用約定 *pointer)(parameter list); 
  • pointer爲函數指針變量名,type爲所指函數的返回值類型,parameter list爲所指函數的參數類型列表 

3.面試小問題 

  • 如何使用C語言直接跳轉到某個固定的地址開始執行?

4.編程實驗 

  • 函數指針的使用  
#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;
}
  • 運行結果:

     

  • 當修改:void(*pf)() = ( void(*)() )0x400564;,運行結果一樣。

5.回調函數 

  • 回調函數是利用函數指針實現的一種調用機制 
  • 回調機制原理 
    • 調用者不知道具體事件發生時需要調用的具體函數 
    • 被調函數不知道何時被調用,只知道需要完成的任務 
    • 當具體事件發生時,調用者通過函數指針調用具體函數 
    • 回調機制中的調用者和被調函數互不依賴 
  • 回調函數使用示例 
#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;
}
  • ​​​​​​​  運行結果:

6.小結

            C語言中的函數都有特定的類型 

            可以使用函數類型定義函數指針

            函數指針是實現回調機制的關鍵技術 

            通過函數指針可以在C程序中實現固定地址跳轉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章