1、指針函數:本質是一個函數。函數返回類型是某一類型的指針
格式: 類型標識符 *函數名(參數表)
int *f(x,y);
float *fun(); float *p; p = fun(a);
int* find(void); int * find(){ int *pp ; pp= 0; return pp; } int main(int argc, const char * argv[]) { int *pp ; pp = find(); return 0; }
本質是函數 只是這個函數返回的是一個執行某一類型數據的指針;
2、函數指針是指向函數的指針變量,即本質是一個指針變量。
格式:類型說明符 (*函數名)(參數)
int (*f) (int x);
指向函數的指針包含了函數的地址,可以通過它來調用函數
其實這里不能稱為函數名,應該叫做指針的變量名。這個特殊的指針指向一個返回整型值的函數實現地址。指針的聲明筆削和它指向函數的聲明保持一致。
int xMax(int a,int b){ return a>b?a:b; } int main(int argc, const char * argv[]) { int (*xMaxValue)(int a,int b) = &xMax;// &可以省略 int d = xMaxValue(xMaxValue(2,4),3); printf("最大的數字是: %d\n", d); }
指針名和指針運算符外面的括號改變了默認的運算符優先級。如果沒有圓括號,就變成了一個返回整型指針的函數的原型聲明。
辨別方式就是看函數名前面的指針*號有沒有被括號()包含,如果被包含就是函數指針,反之則是指針函數。
3、回調函數
函數指針作為某個函數的參數
函數指針變量可以作為某個函數的參數來使用的,回調函數就是一個通過函數指針調用的函數。
簡單講:回調函數是由別人的函數執行時調用你實現的函數。
// 回調函數 void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { for (size_t i=0; i<arraySize; i++) array[i] = getNextValue(); } // 獲取隨機值 int getNextRandomValue(void) { return rand(); } int main(void) { int myarray[10]; populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("\n"); return 0; }