1. 程式人生 > 其它 >函式指標(對於4.2.6的補充)

函式指標(對於4.2.6的補充)

函式指標的型別一般這樣定義
返回值型別 (*函式指標)(引數型別)
這邊的引數型別有時候我們經常使用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]);
同理,對於函式指標陣列的指標的方法也是類似的 他是定義了一個指標,指向存放函式指標的陣列。 注意陣列名本身就代表了地址,如果加上*p表示其指向的內容後,不能在使用p[]的形式來呼叫,否則會出現錯誤 換言之,*p和p[]這兩種呼叫數組裡面的元素的方法應該是二選一的不能同時存在 指標存放的是地址,指標陣列存放的是指標,陣列指標存放的是陣列的地址,函式指標陣列指標存放的是指向存放函式指標陣列的指標 函式指標陣列指標存放的是函式指標陣列指標的地址,所以呼叫的時候需要先到達存放函式指標陣列首地址的地點,再通過裡面的地址來到函式指標陣列的第一個元素位置

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));

注意:函式指標陣列指標定義出來以後本身是一個指標,他並沒有分配出來給函式指標陣列的空間,因此不能將函式直接賦值給他,而應該自己再定義一個函式指標陣列,再將函式指標陣列所在的地址傳送給他才可以
如果不理解的話,可以先通過陣列指標和指標陣列來輔助理解。