C :函數指針和指針函數的區別

2024年2月6日 19点热度 0人点赞

函數指針和指針函數是兩個在C/C 語言中使用的概念,雖然它們的名字很相似,但是它們的含義和用法卻完全不同。

首先,我們來討論函數指針(Function Pointer)。函數指針是指向函數的指針變量,可以用來存儲函數的地址,並且可以通過該指針調用對應的函數。函數指針的聲明格式為:`返回值類型 (*指針變量名)(參數列表)`,其中括號是必須的,用來明確指針指向的是函數。下面是一個簡單示例:

#include <stdio.h>
	int add(int a, int b) {
	return a   b;
}
int main() {
   int (*funcPtr)(int, int); // 聲明一個函數指針
   funcPtr = &add; // 指針指向add函數
   int result = (*funcPtr)(3, 4); // 通過指針調用add函數
   printf("Result: %d\n", result);
   return 0;
}

在上面的示例中,我們先聲明了一個函數指針`funcPtr`,它指向一個有兩個int類型參數並返回int類型的函數。然後,將`funcPtr`指向了`add`函數,最後通過`(*funcPtr)(3, 4)`的方式調用了`add`函數並得到結果。

接下來,我們來看看指針函數(Pointer to Function)。指針函數是指返回類型為指針的函數,也就是說它返回值是一個指針類型。指針函數的聲明格式為:`返回值類型 (*函數名)(參數列表)`。下面是一個簡單示例:

#include <stdio.h>
int* max(int a, int b) {
	if (a > b) {
		return &a;
	} else {
		return &b;
	}
}
int main() {
	int a = 5, b = 3;
	int* (*funcPtr)(int, int); // 聲明一個指針函數
	funcPtr = &max; // 指針指向max函數
	int* resultPtr = (*funcPtr)(a, b); // 通過指針調用max函數,並得到指針返回值
	printf("Max: %d\n", *resultPtr);
	return 0;
}

在上面的示例中,我們先聲明了一個指針函數`max`,它接受兩個int類型參數,並返回一個int類型的指針。然後,聲明了一個指針函數指針`funcPtr`,指向了`max`函數。最後,通過`(*funcPtr)(a, b)`調用了`max`函數,並得到了它的返回值,即`a`和`b`中較大的值的指針。通過`*resultPtr`可以取得指針指向的值。

總結一下,函數指針是指向函數的指針變量,用於調用對應的函數;指針函數是返回指針的函數,調用它將返回一個指針值。這兩個概念的區別主要在於它們的定義和用法,需要根據具體的場景和需求選擇使用。