首頁 > 軟體

C語言深入淺出分析函數指標

2022-07-13 14:03:27

我們先看一個程式碼:

#include<stdio.h>
void test()
{
	printf("hahan");
}
int main()
{
	printf("%pn", test);
	printf("%pn", &test);		
	return 0;
}

輸出的是兩個地址,函數名就是函數的地址

將函數的地址存起來:

#include<stdio.h>
void test()
{
	printf("hahan");
}
int main()
{
	//函數指標
	int (*pf)(const char*) = test;
	(*pf)("abc");
	pf("abc");
	test("abc");
	return 0;
}

函數指標也是一種指標,是指向函數的指標

int (*pf)(const char*) = test

pf先和*結合,是指標,指向test函數,無引數,返回值型別為void

《C陷阱和缺陷》中的一段程式碼:

( *(void (*)())0 )();

void(*)()是函數指標型別

( void (*)() )0 是強制型別轉換,結果是函數的地址,0地址中存放一個函數,無引數,無返回值

以上程式碼總體是一次函數呼叫,呼叫的是0作為地址處的函數,首先把0強制轉換為無參,返回型別是void的函數的地址,其次是呼叫0地址處的這個函數

再觀察這段程式碼:

void (*signal(int , void(*)(int)))(int);

程式碼可以化簡:

把void(*)(int)重新命名為pfun_t

typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);

signal 與後面的括號結合,是函數名

( int , void(*)(int) ) 是兩個引數型別

以上程式碼是一次函數宣告 ,signal函數的第一個引數的型別是int,第二個引數型別是函數指標,該指標指向的是一個引數型別為int,返回值為空的函數,signal函數的返回型別也是一個指標函數,該函數指標也指向的是一個引數型別為int,返回值為空的函數

使用函數指標簡化程式碼:

當功能近似的函數中有較多相同的程式碼時,可以用函數指標來簡化程式碼

void calc( int(*pf) (int, int) )

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
	printf("*****************n");
	printf("***1.sum 2.sub***n");
	printf("***3.mul 4.div***n");
	printf("*****0.退出*****n");
	printf("*********n");
 
}
int add(int x, int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}
//計算
void calc(int(*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("輸入兩個運算元:");
	scanf("%d%d", &x, &y);
	ret = pf(x, y);
	printf("%dn", ret);
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				calc(add);
				break;
			case 2:
				calc(sub);
				break;
			case 3:
				calc(mul);
				break;
			case 4:
				calc(div);
				break;
			case 0:
				printf("退出計算器!n");
				break;
			default:
				printf("選擇錯誤!n");
				break;
		}
	} while (input);
	return 0;
}

上述程式碼使用了回撥函數,回撥函數就是一個通過函數指標呼叫的函數。如果你把函數的指標(地址)作為引數傳遞給另一個函數,當這個指標被用來呼叫其所指向的函數時,我們就說這是回撥函數。回撥函數不是由該函數的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。

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


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