1. 程式人生 > >C語言第6課——函式指標

C語言第6課——函式指標

定義

函式指標,其本質是一個指標變數,該指標指向這個函式。總結來說,函式指標就是指向函式的指標。 

宣告格式:型別說明符 (*函式名) (引數) 

int (*fun)(int x,int y);

函式指標是需要把一個函式的地址賦值給它,有兩種寫法:

fun = &Function;
fun = Function;

取地址運算子&不是必需的,因為一個函式識別符號就表示了它的地址,如果是函式呼叫,還必須包含一個圓括號括起來的引數表。

呼叫函式指標的方式也有兩種:

x = (*fun)();
x = fun();

兩種方式均可,其中第二種看上去和普通的函式呼叫沒啥區別,如果可以的話,建議使用第一種,因為可以清楚的指明這是通過指標的方式來呼叫函式。

例項

以下例項聲明瞭函式指標變數 p,兩個int型別引數,無返回值,指向Add、Decr、Multi、Div:

#include <stdio.h>
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
void(*p)(int x, int y);
void Add(int a, int b);
void Decr(int a, int b);
void Multi(int a, int b);
void Div(int a, int b);

int main()
{
	int a, b;
	char ch;
	printf("請輸入兩個整數:\n");            
	scanf_s("%d%d", &a, &b);                 
	ch = '+';      //改變運算子,會呼叫不同的程式
	switch (ch)
	{
	case '+':
		p = Add;
		(*p)(a, b);
		break;
	case '-':
		p = Decr;
		(*p)(a, b);
		break;
	case '*':
		p = Multi;
		(*p)(a, b);
		break;
	case '/':
		p = Div;
		(*p)(a, b);
		break;
	default:
		break;
	}
	return 0;
}

void Add(int a, int b)
{
	printf("%d+%d=%d", a, b, a + b);
}

void Decr(int a, int b)
{
	printf("%d-%d=%d", a, b, a - b);
}

void Multi(int a, int b)
{
	printf("%d*%d=%d", a, b, a * b);
}

void Div(int a, int b)
{
	printf("%d/%d=%d", a, b, a / b);
}

回撥函式(函式指標作為某個函式的引數)

函式指標變數可以作為某個函式的引數來使用的,回撥函式就是一個通過函式指標呼叫的函式。

簡單講:回撥函式是由別人的函式執行時呼叫你實現的函式。

例項

showInfo(int a,int b,int (*p)(a,b))就是一個回撥函式。第三個引數為函式指標。

#include <stdio.h>
void showInfo(int a, int b, int(*p)(a, b));
int Add(int a, int b);
int Decr(int a, int b);
int Multi(int a, int b);
int Div(int a, int b);

int main()
{
	showInfo(5, 2,Add);
	return 0;
}

void showInfo(int a, int b, int(*p)(a, b))
{
	printf("%d", (*p)(a, b));
}

int Add(int a, int b)
{
	return a + b;
}

int Decr(int a, int b)
{
	return a - b;
}

int Multi(int a, int b)
{
	return a * b;
}

int Div(int a, int b)
{
	return a / b;
}