一、函數指針和函數指針數組的區別
函數指針是指向函數的指針變數,而函數指針數組則是由函數指針組成的數組。
函數指針數組定義:
int (*funcArr[5])(int a, int b);
上面的定義中,funcArr是一個長度為5的數組,每個元素都是一個指向返回類型為int,參數類型為int和int的函數的指針。
二、函數指針的使用
函數指針可以用來調用函數,也可以作為函數的返回值或者參數。
函數指針作為形參使用:
int add(int a, int b);
void callback(int (*func)(int, int));
int main() {
callback(add);
return 0;
}
void callback(int (*func)(int, int)) {
func(1, 2);
}
上面的代碼中,在主函數中調用callback函數,並將add函數的地址作為參數傳入callback函數中。在callback函數中,函數指針func被調用,此時add函數也被調用,並返回了3。
三、函數指針和指針函數
函數指針是指向函數的指針變數,而指針函數則是返回值為指針的函數。
指針函數的定義及使用:
int* getArray() {
int* arr = (int*)malloc(sizeof(int) * 10);
return arr;
}
int main() {
int* ptr = getArray();
return 0;
}
上面的代碼中,getArray函數返回一個int類型的指針。在主函數中,使用指針變數ptr來接收getArray函數的返回值。
四、指針函數怎麼用
指針函數可以用來返回指針,也可以作為函數的參數。
指針函數作為實參使用:
void print(int* arr) {
int i;
for (i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void fill(int* (*getArray)()) {
int i;
int* arr = getArray();
for (i = 0; i < 10; i++) {
arr[i] = i;
}
print(arr);
}
int* getArray() {
int* arr = (int*)malloc(sizeof(int) * 10);
return arr;
}
int main() {
fill(getArray);
return 0;
}
上面的代碼中,fill函數的參數是一個指向返回值為int類型指針的函數指針,即getArray函數。在fill函數內部,getArray函數被調用,並返回一個int類型的指針。fill函數利用這個指針,將其內容填充為0~9的數字,並調用print函數列印數組。
五、函數指針表
函數指針表是由函數指針構成的數組,每個函數指針指向不同的函數。我們可以通過函數指針表來實現對不同函數的動態調用。
函數指針表的定義和使用:
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int main() {
int (*funcTable[])(int, int) = {add, sub, mul, div};
int i;
for (i = 0; i < 4; i++) {
int result = funcTable[i](10, 5);
printf("%d ", result);
}
return 0;
}
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int div(int a, int b) {
return a / b;
}
上面的代碼中,funcTable是一個函數指針數組,其中的每個元素都是指向各自函數的函數指針。在主函數中,我們遍歷函數指針表,依次調用指向的函數。
六、指針函數和函數指針的區別
指針函數返回指針類型的數據,而函數指針是指向函數的指針變數。
指針函數的用法:
int* getArray() {
int* arr = (int*)malloc(sizeof(int) * 10);
return arr;
}
int main() {
int* ptr = getArray();
return 0;
}
函數指針的用法:
int add(int a, int b);
int main() {
int (*func)(int, int) = add;
int result = func(1, 2);
return 0;
}
int add(int a, int b) {
return a + b;
}
七、指針函數和普通函數的區別
指針函數返回指針類型的數據,而普通函數則不返回指針類型數據。
指針函數的用法:
int* getArray() {
int* arr = (int*)malloc(sizeof(int) * 10);
return arr;
}
int main() {
int* ptr = getArray();
return 0;
}
普通函數的用法:
int add(int a, int b);
int main() {
int result = add(1, 2);
return 0;
}
int add(int a, int b) {
return a + b;
}
八、指針變數函數
指針變數函數是一個函數,它返回一個指針變數。
指針變數函數的用法:
int* getPointer(int value) {
int* ptr = (int*)malloc(sizeof(int));
*ptr = value;
return ptr;
}
int main() {
int* ptr = getPointer(10);
printf("%d ", *ptr);
free(ptr);
return 0;
}
在上面的代碼中,getPointer函數返回一個指向int類型變數的指針變數,其中指針變數所指向的int型變數的值為函數傳入的參數value。在主函數中,我們調用getPointer函數,並將其返回的指針變數的值列印出來。
九、指針與函數的關係區別
指針是一種數據類型,可以指向內存中存儲的任何數據類型,包括函數。
指向函數的指針變數的用法:
int add(int a, int b);
int main() {
int (*func)(int, int) = add;
int result = func(1, 2);
return 0;
}
int add(int a, int b) {
return a + b;
}
上面的代碼中,定義了一個指向函數add的函數指針變數func。在主函數中,我們遍歷函數指針表,依次調用指向的函數。
十、函數指針和回調函數
函數指針可以作為回調函數使用,回調函數是指在某個事件發生時由系統調用的函數。
函數指針作為回調函數的用法:
void invoke( void (*cb)(const char*) ) {
cb("hello");
}
void myCallback(const char* str) {
printf("%s", str);
}
int main() {
invoke(myCallback);
return 0;
}
上面的代碼中,myCallback函數是一個回調函數,它被invoke函數在事件發生時調用。在主函數中,我們調用invoke函數,並把myCallback函數的指針作為參數傳遞給它。
原創文章,作者:FHMM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131630.html