函式指標陣列和函式指標陣列指標
我們來看看今天的標題,你有沒有覺得暈乎乎的,之前小企鵝發過一篇關於函式指標的用法,但是有粉絲反應沒講完全,所以今天答應給粉絲更新的一篇關於函式指標的深入探討文章。
函式指標陣列
我們看最後陣列兩個字,我們學C語言再也熟悉不過了吧,就是同一個型別的資料組成的資料集合,然後我們在往前看,它是“指標”什麼意思,就是這個數組裡面裝的資料集合都是是指標,那我們都知道C語言指標也是分型別的,有整型指標,字元型指標,浮點型指標就,結構體指標等等,但是我們看最開始的“函式”,那說明我們這個數組裡面的指標型別是函式。
我們舉個例子看一下啊;
#include <stdio.h>#include<string.h>char * fun1(char *p){printf("%s\n",p);return 0;}char * fun2(char *p){printf("%s\n",p);return 0;}char * fun3(char *p){printf("%s\n",p);return 0;}int main(){char * (*pfun[3])(char *p);//我們定義一個函式指標指標陣列;//給我們的陣列賦值pfun[0]=fun1;//把函式fun1賦值給陣列第一個元素,直接使用函式名;pfun[1]=&fun2;//我們也可以在函式名前面加&把fun2地址付給第二個元素;pfun[2]=&fun3;//給陣列第三個元素賦值為fun3;//使用pfun[0]("函式fun1");pfun[1]("函式fun2");pfun[2]("函式fun3");return 0;}
結果
結果和我們直接使用fun1、fun2、fun3效果是一樣的。
在這裡我覺得可以在講一個知識點,我們看程式碼中給第一個元素賦值是直接使用函式名,而後面兩個用的都是&修飾的函式呢?他們有什麼區別,我們來看一下下面的這個程式碼,我們在剛剛的程式碼打印出fun1和&fun1的值看一下;
printf("fun1=%u\n",fun1);
printf("&fun1=%u\n",&fun1);
結果如下圖:
結果分析
我們可以看到其實打印出來的值是一樣,所有我們其實可以認為函式名教師函式的地址。
我們的函式指標陣列就講到這裡了,包括對函式指標的定義,使用都給大家講解了。
函式指標陣列指標
我先解釋一下這個名字到底是什麼吧,首先“函式指標陣列”和我們剛剛在上面分析的一樣,就是一個數組,數組裡面的元素是函式指標,那我們在看最後兩個字“指標”這說明說明,說明他是一個指標呀,比如我們說“XXX陣列”,那它就是陣列,這裡我們看成“XXX指標”那它就是一個指標,既然他是一個指標那它是誰的指標?他是一個數組的指標,它指向一個數組,數組裡面都是函式型別的指標。
char * (*(*ptrfun)[3])(char *p);//定義一個函式指標陣列指標;
ptrfun=&pfun;//把函式指標陣列的地址賦值給指標ptrfun;
pfun[0]=fun1;//把函式fun1賦值給陣列第一個元素,直接使用函式名;
pfun[1]=&fun2;//我們也可以在函式名前面加&把地址付給第二個元素;
pfun[2]=&fun3;//給陣列第三個元素賦值;
結果分析
我們可以發現函式指標陣列指標對函式的呼叫結果也是和直接呼叫函式、呼叫函式陣列元素一樣的都可以對我們的函式進行呼叫。
現在你對函式指標陣列和函式指標陣列指標有更好地理解了麼?我們在看下面這兩個表示式:
int * (*fun[3])(char *p);
int* (*(*fun)[3])(char *p);
你現在可以解釋這兩個表示式個表示的意思了麼?