函數指針數組
語文要學好.
這三個詞我們擴充一下
數組 int Array[N];
指針的數組 int *Array[N];
函數的指針的數組 int (*function_pointer)[N](int,int);
按照中文的習慣,函數指針數組應該就是函數的指針的數組的簡寫了.
從低級一點點進化到高級
數組
int a[2];
數組就是這樣,沒什么好說的了.就是有兩個格子,里面存了兩個int類型的數字.這兩個格子被看成a.大小使用sizeof(a)來計算,就是兩個int的大小.約定一個int大小是4個字節,那么sizeof(a)就是8個字節大小了.
指針的數組
int *p[2];
難度加大了一點,但是我們冷靜一下,還是可以理解的.這還是一個數組,還是兩個格子,每個格子里存的是指向int類型的指針.每個指針的大小也約定是4個字節.那么sizeof(p);也就是8個字節了.
格子p1,格子p2 這兩個格子分別指向int類型的數字. `p1->&a;p2->&b;` 指針->這個符號是指針專用的.只有指針才能使用->.
函數的指針的數組
按照道理里將應該寫成 `int (*func)(int a)[2];`,但是應該寫成`int (*fp)[N](int, int);`
開始變得有意思了.我們讀一下這個東西.首先看哪里呢?我們先不看哪里,我們先來把這一大串東西分解一下.
int (*func)[2] (int a);好了,這么一看就明白了.
先讀標識符,和他相鄰的是指針符號,那么func是一個指針,然后往右,是個數組,那么func應該指向一個數組.那這個數組里存的是什么樣的東西呢?
存的是 參數是一個int,返回值是一個int類型的函數.意思是這兩個格子里存的是兩個函數的地址.
解釋函數指針
我嘗試說明一下這個類型是什么,為什么有這樣的類型.
參數是一個int,返回值是一個int類型的函數 的類型
看到類型這兩個字,你是怎么理解的?
在我看來,類型就是模型,就是模板,是一個藍圖,一個模具.
模具有什么特點?我們有一個米老鼠的模具,使用橡皮泥塞進去,就能倒出來一個米老鼠了.
如果別人拿了一個不一樣的米老鼠過來,你使用這個模具是不能卡進去的.但是使用這個模具倒出來的米老鼠是正好可以卡進去的.
函數的類型就是描述這個函數長什么樣子.描述的要素有:返回值類型 參數個數及其類型. 只要這三個方面一一匹配,我們就函數是同一個類型的.
比如 int (*func)(int a, int b); 這就是一個函數模板,我們可以把這樣的函數叫做米老鼠模板.
如果不給這個模板起名字,我們就說形如這樣的函數就叫做 返回值是一個int類型的指針,參數為int a, int b的類型.
這么叫是不是太費勁了?現在我們就給它起名字叫米老鼠.
使用typedef來進行起名字.
typedef int (*milaoshu)(int a, int b);
好了,現在我們定義了一個新的函數指針類型叫milaoshu. milaoshu類型是一個指向 返回值是int 的有兩個int參數的函數 的指針的類型.
那我們就使用這個milaoshu類型進行聲明吧.
milaoshu p = NULL;
我們聲明了一個milaoshu類型的指針變量p.
這個p目前是指向空的.
除了指向空,它還可以指向milaoshu的類型.
那就是p = func;
調用方式 p(a,b) 就等同於func(a,b);
#include <stdio.h>
#include <stdlib.h>
typedef int (*milaoshu)(int a, int b);
int func(int a, int b){
return a+b;
}
int main() {
int a = 10;
int b = 20;
printf("a+b = %d\n", a+b);
milaoshu p; //如果不給這個類型起名叫米老鼠,那么在聲明變量p的時候應該這樣聲明 int (*p)(int, int);
p = func;
int c = p(a ,b);
printf("a+b = %d\n", c);
return 0;
}
