C語言深入淺出分析函數指針
我們先看一個代碼:
#include<stdio.h>
void test()
{
printf("haha\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
輸出的是兩個地址,函數名就是函數的地址
將函數的地址存起來:
#include<stdio.h>
void test()
{
printf("haha\n");
}
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("%d\n", 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;
}上述代碼使用了回調函數,回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數?;卣{函數不是由該函數的實現方直接調用,而是在特定的事件或條件發(fā)生時由另外的一方調用的,用于對該事件或條件進行響應。
到此這篇關于C語言深入淺出分析函數指針的文章就介紹到這了,更多相關C語言函數指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++使用boost::lexical_cast進行數值轉換
這篇文章介紹了C++使用boost::lexical_cast進行數值轉換的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

