逍遙自在學C語言 | 指針函數與函數指針
前言
在C語言中,指針函數和函數指針是強大且常用的工具。它們允許我們以更靈活的方式處理函數和數據,進而擴展程序的功能。
本文將介紹指針函數和函數指針的概念,并講解一些常見的應用示例。
一、人物簡介
- 第一位閃亮登場,有請今后會一直教我們C語言的老師 —— 自在。

- 第二位上場的是和我們一起學習的小白程序猿 —— 逍遙。

二、指針函數
-
指針函數是返回指針的函數,它的聲明和定義與普通函數類似,但返回類型是一個指針類型。
-
指針函數可以用于返回數組、字符串或動態分配的內存等。
-
示例代碼
#include <stdio.h>
int* getArray() {
static int arr[] = {1, 2, 3, 4, 5};
return arr;
}
int main() {
int* ptr = getArray();
printf("Array elements: ");
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
return 0;
}
-
在上面的示例中,
getArray()函數返回一個指向靜態整數數組的指針 -
在
main()函數中,我們通過指針訪問并打印數組的元素 -
輸出結果
Array elements: 1 2 3 4 5
三、函數指針
-
函數指針是指向函數的指針變量。
-
通過函數指針,我們可以將函數作為參數傳遞給其他函數、在運行時動態選擇要調用的函數等。
-
示例代碼
#include <stdio.h>
/* 加法運算 */
int add(int a, int b) {
return a + b;
}
/* 減法運算 */
int subtract(int a, int b) {
return a - b;
}
void calculate(int (*operation)(int, int), int a, int b) {
int result = operation(a, b);
printf("Result: %d\n", result);
}
int main() {
int x = 10, y = 5;
calculate(add, x, y);
calculate(subtract, x, y);
return 0;
}
-
在上面的示例中,
calculate()函數接受一個函數指針參數operation,該參數指向一個具有兩個整數參數和整數返回值的函數。 -
在
main()函數中,我們使用calculate()函數來執行加法和減法運算。 -
運行結果
Result: 15
Result: 5
四、指針函數的應用
指針函數在以下情況下特別有用:
-
動態分配內存:指針函數可以返回動態分配的內存,允許在運行時靈活地分配和釋放內存。
-
返回數組或字符串:通過指針函數,可以方便地返回數組或字符串,而無需將它們作為函數參數傳遞或使用全局變量。
-
示例代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* createString() {
char* str = (char*)malloc(sizeof(char) * 10);
strcpy(str, "Hello");
return str;
}
int main() {
char* ptr = createString();
printf("String: %s\n", ptr);
free(ptr);
return 0;
}
-
在上面的示例中,
createString()函數動態分配了一個大小為10的字符數組,并將字符串"Hello"復制到該數組中。 -
然后,它返回該數組的指針。在
main()函數中,我們打印并釋放該字符串。
String: Hello
五、函數指針的應用
函數指針具有以下應用場景:
-
回調函數:函數指針可用于實現回調機制,其中一個函數作為參數傳遞給另一個函數,并在需要時被調用。
-
運行時函數選擇:函數指針允許根據運行時的條件選擇要調用的函數,從而實現動態的程序行為。
-
示例代碼
#include <stdio.h>
void greet_english() {
printf("Hello!\n");
}
void greet_spanish() {
printf("Hola!\n");
}
void greet_french() {
printf("Bonjour!\n");
}
int main() {
int choice;
// 聲明函數指針,并初始化為NULL
void (*greet)() = NULL;
printf("請選擇要使用的語言:\n");
printf("1. 英語\n");
printf("2. 西班牙語\n");
printf("3. 法語\n");
printf("\n請輸入對應的數字:");
scanf("%d", &choice);
printf("\n");
// 根據用戶的選擇設置函數指針
if (choice == 1) {
greet = greet_english;
} else if (choice == 2) {
greet = greet_spanish;
} else if (choice == 3) {
greet = greet_french;
} else {
printf("無效的選擇!\n");
return 0;
}
// 如果函數指針不為NULL,則調用相應的函數
if (greet != NULL) {
greet();
}
return 0;
}
- 在這個例子中,我們定義了三個不同的打招呼函數:
greet_english、greet_spanish和greet_french。 - 在
main函數中,我們聲明了一個函數指針greet,并將其初始化為NULL。 - 用戶可以選擇要使用的語言,然后根據選擇將函數指針
greet設置為相應的函數地址。 - 最后,如果函數指針不為
NULL,則調用相應的函數。 - 運行結果
請選擇要使用的語言:
1. 英語
2. 西班牙語
3. 法語
請輸入對應的數字:3
Bonjour!
小結
通過這篇文章,我們學會了
1、指針函數的概念
2、函數指針的概念
3、指針函數的應用
4、函數指針的應用
??歡迎各位 ??點贊 ?收藏 ??評論,如有錯誤請留言指正,非常感謝!

浙公網安備 33010602011771號