1. 从变量到函数:指针概念的延伸
在C语言的世界里,指针一直是个让人又爱又恨的存在。当我们刚理解清楚变量指针的用法时,突然发现指针还能指向函数,这就引出了两个容易混淆的概念:指针函数和函数指针。虽然名称只是顺序调换,但它们的含义和用法却截然不同。
指针函数(Pointer to function)本质上是一个返回指针的函数。就像普通函数返回int、float等类型一样,指针函数返回的是一个指针值。它的声明形式为:
c复制int *func(int a, int b);
这里的func是一个函数,它接收两个int参数,返回一个指向int的指针。星号*紧跟在返回类型后面,表示返回的是指针。
而函数指针(Function pointer)则完全不同,它是一个指向函数的指针变量。也就是说,这个指针变量存储的是一个函数的地址,可以通过它来间接调用函数。它的声明形式为:
c复制int (*funcPtr)(int, int);
这里funcPtr是一个指针,它指向一个接收两个int参数并返回int的函数。星号*被括号括起来,表示这是一个指针。
提示:区分两者的简单方法就是看星号
*是否被括号包含。如果星号被括号包含,就是函数指针;否则就是指针函数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针函数的实际应用场景
指针函数最常见的用途是在需要动态分配内存并返回的情况下。例如,我们可能需要一个函数,它根据输入参数创建并返回一个特定大小的数组:
c复制int *createArray(int size) {
int *arr = (int *)malloc(size * sizeof(int));
if(arr == NULL) {
printf("Memory allocation failed\n");
exit(1);
}
return arr;
}
这个createArray函数就是一个典型的指针函数,它动态分配内存并返回指向这块内存的指针。使用时需要注意:
- 调用者需要负责释放返回的内存,否则会造成内存泄漏
- 返回的指针可能为NULL,需要进行错误检查
- 不能返回指向局部变量的指针,因为局部变量在函数返回后就会被销毁
指针函数也常用于返回字符串。例如标准库中的strdup函数,它接收一个字符串,返回一个新分配的副本:
c复制char *strdup(const char *s) {
char *d = malloc(strlen(s) + 1);
if(d == NULL) return NULL;
strcpy(d, s);
return d;
}
3. 函数指针的深入解析
函数指针是C语言中实现回调机制、策略模式等高级特性的基础。它的声明语法看起来有些复杂,但其实遵循一定的模式:
c复制返回类型 (*指针变量名)(参数类型列表);
例如,声明一个指向接收两个int并返回int的函数的指针:
c复制int (*operation)(int, int);
我们可以将匹配的函数赋值给它:
c复制int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
operation = add; // 指向add函数
int result = operation(3, 4); // 调用add(3,4)
operation = subtract; // 现在指向subtract函数
result = operatio
