函式指標(對於4.2.6的補充)
阿新 • • 發佈:2021-10-14
函式指標的型別一般這樣定義
返回值型別 (*函式指標)(引數型別)
這邊的引數型別有時候我們經常使用const void*因為這個void型別的指標的相容性非常好,void型別的指標可以強制轉化成其他型別的指標,非常方便
因為函式再編譯的過程中函式名其實最後就是通過將其轉化為函式的地址來實現的因此通過(*函式指標)(參量)
的效果等價於函式指標(參量)
eg:
int (*f)(int a, int b) = sum;
關於函式指標陣列
eg:
int (*f[2])(int a, int b) = {sum, sum};
函式指標陣列的呼叫如下
點選檢視程式碼
int (*f[2])(int a, int b); f[1] = sum; printf("%d\n", f[1](1, 2));
其實質只是將函式指標轉化成函式指標陣列,也就是說可以同時呼叫多個函數了
注意:
int* p[5]
定義的是指標陣列
int (*p)[5]
定義的是陣列指標,陣列指標是一個指向陣列的指標,注意該指標指向的只能是一維陣列,如果是多維陣列就應該有多個數組指標,因此他又被稱作行指標
eg:
點選檢視程式碼
int a[10] = {1, 2, 3};
int (*b)[10];
b = &a;
呼叫的方法如下
點選檢視程式碼
int (*a)[10];
int b[10] = {1, 2, 3};
a = &b;
printf("%d\n", (*a)[1]);
eg:
點選檢視程式碼
int ((* (*f)[2])(int a, int b));
int (*x[2])(int a, int b);
f = &x;
*(*f) = sum;
(*f)[0] = sum;
printf("%d\n", (*x)(1, 2));
注意:函式指標陣列指標定義出來以後本身是一個指標,他並沒有分配出來給函式指標陣列的空間,因此不能將函式直接賦值給他,而應該自己再定義一個函式指標陣列,再將函式指標陣列所在的地址傳送給他才可以
如果不理解的話,可以先通過陣列指標和指標陣列來輔助理解。