##函數指針數組數組
語文要學好. 這三個詞咱們擴充一下函數
數組 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個字節大小了.code
###指針的數組 int *p[2]; 難度加大了一點,可是咱們冷靜一下,仍是能夠理解的.這仍是一個數組,仍是兩個格子,每一個格子裏存的是指向int類型的指針.每一個指針的大小也約定是4個字節.那麼sizeof(p);也就是8個字節了. 格子p1,格子p2 這兩個格子分別指向int類型的數字. p1->&a;p2->&b;
指針->這個符號是指針專用的.只有指針才能使用->.io
###函數的指針的數組 按照道理裏將應該寫成 int (*func)(int a)[2];
,可是應該寫成int (*fp)[N](int, int);
開始變得有意思了.咱們讀一下這個東西.首先看哪裏呢?咱們先不看哪裏,咱們先來把這一大串東西分解一下. int (*func)[2] (int a);好了,這麼一看就明白了. 先讀標識符,和他相鄰的是指針符號,那麼func是一個指針,而後往右,是個數組,那麼func應該指向一個數組.那這個數組裏存的是什麼樣的東西呢? 存的是 參數是一個int,返回值是一個int類型的函數.意思是這兩個格子裏存的是兩個函數的地址.function
###解釋函數指針 我嘗試說明一下這個類型是什麼,爲何有這樣的類型.模板
參數是一個int,返回值是一個int類型的函數
的類型class
看到類型這兩個字,你是怎麼理解的? 在我看來,類型就是模型,就是模板,是一個藍圖,一個模具. 模具備什麼特色?咱們有一個米老鼠的模具,使用橡皮泥塞進去,就能倒出來一個米老鼠了. 若是別人拿了一個不同的米老鼠過來,你使用這個模具是不能卡進去的.可是使用這個模具倒出來的米老鼠是正好能夠卡進去的.變量
函數的類型就是描述這個函數長什麼樣子.描述的要素有:返回值類型 參數個數及其類型. 只要這三個方面一一匹配,咱們就函數是同一個類型的. 好比 int (*func)(int a, int b); 這就是一個函數模板,咱們能夠把這樣的函數叫作米老鼠模板.di
若是不給這個模板起名字,咱們就說形如這樣的函數就叫作 返回值是一個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; }