一、指针函数与函数指针
让我们以入住一家酒店的例子来对比解释。
1、指针函数
指针函数,像是一家酒店的前台服务,当你到达酒店办理入住服务的时候,就调用了“入住服务”函数,这个函数返回的并不是一个具体的房间,而是一张房卡,也就是“入住服务”函数结果指向的内存位置,这张房卡,就是一个指针,你可以凭借房卡找到“入住服务”函数的结果,你的房间。
2、函数指针
函数指针,就像房间里的客户服务单上的服务电话号码,当你需要续房服务的时候,就拨打前台电话(续房服务函数的指针)来调用前台的续房服务,当你需要送餐服务的时候,就拨打餐厅电话(送餐服务函数的指针)来调用送餐服务,当你需要打扫房间的时候,就拨打客房服务的电话(客房服务函数的指针)来调用客房服务。你完全不需要知道服务是如何运作的,只需要知道它的电话号码(函数在内存中的地址)。
二、代码实例
1、指针函数
#include <stdio.h>
// 定义一个指针函数:返回一个指针
int* getRoomCard(int roomNumber) {
static int room[5] = {101, 102, 103, 104, 105}; // 模拟房间号
return &room[roomNumber - 1]; // 返回房间号的地址
}
int main() {
int* roomCard = getRoomCard(3); // 获取房间卡(指针)
printf("Your room number is: %d\n", *roomCard); // 使用房卡访问房间
return 0;
}
输出结果:
Your room number is: 103
解释:
getRoomCard是一个指针函数,它返回一个内存地址(房间号),房卡(指针)让你找到房间。
2、函数指针
#include <stdio.h>
// 定义不同的服务函数
void renewRoom() {
printf("Your room has been renewed.\n");
}
void orderFood() {
printf("Your food is on the way.\n");
}
void cleanRoom() {
printf("Your room will be cleaned shortly.\n");
}
// 定义函数指针类型
typedef void (*ServiceFunction)();
int main() {
// 模拟客户服务单
ServiceFunction serviceList[3] = {renewRoom, orderFood, cleanRoom};
printf("Select a service: \n1. Renew Room\n2. Order Food\n3. Clean Room\n");
int choice;
scanf("%d", &choice);
if (choice >= 1 && choice <= 3) {
serviceList[choice - 1](); // 通过函数指针调用服务
} else {
printf("Invalid choice.\n");
}
return 0;
}
输入与输出:当输入2时
Select a service:
1. Renew Room
2. Order Food
3. Clean Room
Your food is on the way.
解释:
ServiceFunction是一个函数指针类型,可以指向任何返回void且无参数的函数。
serviceList是一个函数指针数组,模拟客户服务单上的电话号码。
用户输入选择后,通过函数指针调用相应的服务,就像拨打客户服务电话。