讓我們徹底搞懂C C 函式指標吧(二)

2021-06-28 05:17:40 字數 2664 閱讀 6488

如果你已經明白了函式的引數機制,而且完全理解並實踐了3.3節的內容,這一節其實是很簡單的。只需要在函式的引數列表中,宣告乙個函式指標型別的引數即可,然後再呼叫的時候傳給它乙個實參就可以了。你可以這麼想象,就是把函式指標的賦值語句的等號換成了形參和實參結合的模式就行。

下面給乙個簡單的例子:

/**author:choas lee

*date:2012-02-28

*/#include

float add(

float a,float b) 

float minus(

float a,float b) 

float multiply(

float a,float b) 

float divide(

float a,float b) 

int pass_func_pointer(

float (*pfunction)(float a,float b)) 

int main() 

輸出結果為:

result=22.000000 

result=-2.000000 

result=120.000000 

result=0.833333 

函式指標可以作為返回值。我們先模擬的思考一下,如果說整型可以作為返回值,你會怎麼宣告函式?嗯,應該是下面這個樣子的:

int func(){}

整數對應的型別為int。同樣再模擬以下,如果說整型指標可以作為返回值,你會怎麼宣告?嗯,這個貌似難度也不大:

int * func(){}

好吧,現在說函式指標如果可以作為返回值,你該怎麼宣告?首先要保證的一點就是返回的函式指標的型別必須是能夠明顯的表達在這個函式的宣告或者定義形式中的,也就是說在這個形式中,要能夠包含函式指標所對應的能夠確定函式型別的資訊:這個函式型別的返回值型別,這個函式型別的引數個數,這個函式型別的引數型別。,

現在我們在模擬一次,如果要返回浮點型指標,那麼返回型別應該表達為:

float *

如果要函式指標對應的函式是返回值為浮點型,帶有兩個引數,兩個引數都是浮點型,那麼返回型別應該表達為下面的表達形式:

float (*)(float ,float )

嗯,沒辦法,函式的語義比較複雜,對應的表現就是形式的複雜性了。對於返回為浮點型指標的情況,定義的函式的名稱放在「float *」的後面,而對於返回為上面型別的函式指標的話,定義的函式就要放在「(*)」這個括號中的*的後面了。

所以對於以下形式:

float (* func(char op) ) (float ,float)

其具體含義就是,宣告了這樣乙個函式:

l  其名稱為func,其引數的個數為1個;

l  其各個引數的型別為:op—char;

l  其返回變數(函式指標)型別為:float(*)(float,float)

再次強調:函式指標時變數哦。

到了這裡之後,我們再來分析一下unix的系統呼叫函式signal的定義形式:

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

其具體含義為就是,宣告了這樣乙個函式:

l  其函式名稱為:signal

l  其引數個數為:2

l  其各個引數的型別為:signo--int, func— void (*)(int)

l  其返回的變數(函式指標)的型別為:void(*)(int)

上面這個函式比較經典,有乙個引數型別為函式指標,返回值還是函式指標。

哦,我的天,如果你一步一步看到這裡了,就快大功告成啦。嘿嘿,接下來看乙個例子:

/*

*author:choas lee

*date:2012-02-28

*/#include

#include

#include

float add(

float a,float b) 

float minus(

float a,float b) 

float multiply(

float a,float b) 

float divide(

float a,float b) 

float(* functionmap(

char op) )(float,float)  } 

int main() 

; int len=strlen(ops); 

int i=0; 

float (*returned_function_pointer)(

float,float); 

for(i=0;i

return 0; 

}

計算的結果為:

the result caculated 

by the operator + is 15.000000 

the result caculated by the operator - 

is 5.000000 

the result caculated by the operator * 

is 50.000000 

the result caculated by the operator \ 

is 2.000000 

嗯,讓我們徹底搞懂C C 函式指標吧(二)

如果你已經明白了函式的引數機制,而且完全理解並實踐了3.3節的內容,這一節其實是很簡單的。只需要在函式的引數列表中,宣告乙個函式指標型別的引數即可,然後再呼叫的時候傳給它乙個實參就可以了。你可以這麼想象,就是把函式指標的賦值語句的等號換成了形參和實參結合的模式就行。下面給乙個簡單的例子 author...

嗯,讓我們徹底搞懂C C 函式指標吧(三)

函式指標有意思的地方在於,它使用從0到n 1這個n個連續的整數下標直接對映到函式上。和前面一樣,我們也是模擬著定義普通指標陣列來定義函式指標陣列。首先,考慮乙個浮點數指標陣列,陣列的長度為10.我們都知道用下面的形式來定義 float pfloatarray 10 從形式上分析,用中括號明確了是定義...

讓我們的領域邏輯徹底裸奔吧

菜阿斌以前寫了兩篇很好的文章 為什麼要讓我們的 領域模型 裸奔?上 下 在我的 架構視角面面觀中也介紹了領域邏輯經常被web 元件api 分布元件api orm元件api ado api 等汙染,上面的幾篇文章講了領域裸奔的重要性 以及常見專案中的領域被汙染的問題,關於如何解決該問題,網上關於這方面...