函數(shù)指針作為結(jié)構(gòu)體成員
來(lái)源:嵌入式大雜燴
在C語(yǔ)言程序中,數(shù)據(jù)結(jié)構(gòu)和算法是兩個(gè)基本的元素。C語(yǔ)言的基本數(shù)據(jù)類(lèi)型、結(jié)構(gòu)體、數(shù)組和聯(lián)合體是數(shù)據(jù)結(jié)構(gòu)的代表;C語(yǔ)言中的函數(shù)則是算法的代表。只有將數(shù)據(jù)結(jié)構(gòu)和算法有機(jī)結(jié)合才能構(gòu)成具有一定功能的程序。
函數(shù)指針在嵌入式中的應(yīng)用非常廣泛,常常把函數(shù)指針作為結(jié)構(gòu)體的成員、作為函數(shù)的參數(shù)等。如在物聯(lián)網(wǎng)操作系統(tǒng)RT-Thread內(nèi)核源碼中,有如下代碼:
1、函數(shù)指針作為結(jié)構(gòu)體成員

2、函數(shù)指針作為函數(shù)的參數(shù)

建立一個(gè)結(jié)構(gòu)體,用于四則運(yùn)算(根據(jù)函數(shù)指針的指向可以選擇加法運(yùn)算、減法運(yùn)算、乘法運(yùn)算、除法運(yùn)算),如
typedef int (*fun_t)(int, int);
// 包含了數(shù)據(jù)和算法的結(jié)構(gòu)體
struct Source
{
int a; // 數(shù)據(jù)a
int b; // 數(shù)據(jù)b
fun_t operation; // 算法operation
};主函數(shù)內(nèi)可以進(jìn)行如下操作:
struct Source data;
int result;
data.a = 200;
data.b = 100;
/* 兩個(gè)數(shù)相加的操作 */
data.operation = add2;
result = data.operation(data.a, data.b);
printf("加法運(yùn)算: %d+%d = %d\n",data.a, data.b, result);函數(shù)指針data.operation指向加法函數(shù)add2,則調(diào)用data.operation就可以進(jìn)行加法運(yùn)算。同理,有:
/* 兩個(gè)數(shù)相減的操作 */
data.operation = sub2;
result = data.operation(data.a, data.b);
printf("減法運(yùn)算: %d-%d = %d\n",data.a, data.b, result);
/* 兩個(gè)數(shù)相乘的操作 */
data.operation = mul2;
result = data.operation(data.a, data.b);
printf("乘法運(yùn)算: %d*%d = %d\n",data.a, data.b, result);
/* 兩個(gè)數(shù)相除的操作 */
data.operation = div2;
result = data.operation(data.a, data.b);
printf("除法運(yùn)算: %d/%d = %d\n",data.a, data.b, result);運(yùn)行結(jié)果:

版權(quán)聲明:本文來(lái)源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系我進(jìn)行刪除。
???????????????? END ???????????????
關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。
