c語言作為一門面向過程的語言,那麼他的**塊一般是以函式為最小單位的,我們了解過棧幀之後都知道,**也是有位址的,那麼存放**位址的變數就叫做函式指標變數。
void test()
int main()
這樣我們就可以使用函式指標p來呼叫這個函式,在這裡有一點比較特殊的地方,我們可以通過*解引用呼叫,也可以直接用指標名稱來呼叫。
特別強調,函式指標不可以用來做加減運算,我們都知道,指標做加減時,會加上或者減去其指向型別的大小,但是函式的大小計算起來很不方便,而且這樣的加減沒有意義,所以c語言語法規定不能進行函式指標的加減運算,否則編譯器會直接報錯!
好了,講清楚了基本概念,我們來看一點有意思的**:
//**1
(*(void (*)())0)();
//**2
void(*signal(int, void(*)(int)))(int);
來看**1,先看優先順序最高的部分void(*)(),這是乙個函式指標,那麼給0前面加乙個資料型別代表了什麼意思呢?當然是把0強制轉換成函式指標型別,然後在把他的外殼加上,可以得出結論,這是乙個把0強制轉換成函式指標的函式呼叫。
搞明白**1之後來看**2。依然是先看優先順序,void(*)(int)
依然是乙個函式指標,只是他現在被當成了signal函式的乙個引數,另外乙個引數當然是int,那麼我們就搞清楚了signal(int,void(*)(int))
這一部分內容。然後我們省略這一部分去看剩下的,void(*)(int)
也是乙個函式指標,這個型別自然是用來做函式返回值型別的型別了。所以,這是乙個返回值為函式指標,引數為int和函式指標的函式呼叫。
好了,看了函式指標,你有沒有興趣了解一下函式指標陣列呢?很容易可以想到,既然有函式指標,那當然有函式指標陣列,那麼函式指標陣列是什麼格式呢?
int (*p[10])(); //名稱為p的函式指標陣列
int add(int
x, int
y)int sub(int
x, int
y)int mul(int
x, int
y)int div(int
x, int
y)int main()
;//轉移表
while (input)
else
if (input != 0)
}system("pause");
return
0;}
函式指標 (變數)
函式指標的宣告方法為 函式型別 標誌符 指標變數 名 形參列表 注意函式指標變數和 函式指標型別的區別 1 直接宣告乙個函式指標變數 類似struct型別的定義和宣告,放在一起 int func int x 宣告乙個函式 int f int x 宣告乙個函式指標 f func 將func函式的首位址...
函式指標變數
在c語言中,乙個函式總是占用一段連續的記憶體區域,函式名就是該函式所佔記憶體區域的首位址。我們可以把函式的這個首位址 或稱入口位址 賦予乙個指標變數,使該指標變數指向該函式,然後通過指標變數就可以找到並呼叫這個函式。我們把這種指向函式的指標變數稱為函式指標變數。函式指標變數定義的一般形式為 data...
作文 從指標變數到指標函式,路過函式指標
從最簡單的指標變數出發,比如int a 那麼a是乙個整形變數 現在int a 那麼a是乙個指標變數 指標a表達的是某個位址,它需要依託某個實實在在的東西 比如 typedef struct ringbuff t static ringbuff t ringbuff ringbuff t pringb...