指针函数
定义
指针函数是一种返回值类型为指针的函数,它的本质仍然是函数,只是调用结束后交回给调用方的是一个地址值[4][5]。一般写法是在函数名之前加星号,并在更前面写出基类型,用来指明返回的指针指向何种数据,例如 $int *pfun(int, int);$ 表示该函数返回一个整型指针[2]。
由于圆括号的优先级高于星号,函数名会先与参数表结合,从而确定它是一个函数,然后星号才表示它的返回值是指针,即等价于 $int *(pfun(int, int));$[1][6]。函数返回值必须由同一类型的指针变量接收;返回类型写成 void* 时虽然可以赋值给其他指针类型,但需要强制转换,一般不被推荐[5]。
需要区分的是 函数指针:后者的写法为 $int (*pfun)(int, int);$,括号使函数名先与星号结合,因此它是一个指向函数的指针,本身不是函数[2]。二者只差一对括号,含义却分别落在「函数」和「指针」上[5]。
原理
函数在机器层面有一个起始地址,函数调用即跳转到该地址执行。所谓返回指针,就是让函数把某个数据对象的地址作为结果交给调用方,调用方再用同类型指针去访问那片内存[7]。返回的地址可以来自静态存储区、堆区,也可以是外部传入的数组或结构体元素,决定因素是被指向对象在函数返回后是否仍然有效[8]。
典型用法如返回数组中最大元素的位置:函数遍历数组,记录最大值所在下标,再把这个元素的地址返回,调用方用指针接收后既能读到值,也能拿到它的位置[1]。若返回的是动态申请的内存,则在函数返回后该内存仍然可用,但释放责任随之转移给调用方[3]。
flowchart LR
A[调用方] -->|传入参数/数组首地址| B[指针函数]
B --> C{被指向对象生命周期}
C -->|静态区或堆区: 返回后仍有效| D[返回地址]
C -->|局部变量: 栈帧已销毁| E[地址失效]
D --> F[调用方用同类型指针接收]
E --> G[悬空指针]
发展历程
指针函数并非独立设计出来的语法特性,而是随 C语言 的函数与指针类型体系自然形成的用法。C 语言允许函数返回值是任一可用类型,指针作为类型之一,因而函数可以返回地址,这一形式在早期的 C 教材与课程中即以「返回指针值的函数」为名讲述[9]。
随着 C++ 的发展,同一语法继续沿用,并扩展到自定义类型、类对象和数组的指针返回;开发者也开始用 typedef 定义函数指针类型,以此简化「返回函数指针的函数」这类复杂声明的书写[10][2]。在教学材料中,指针函数与函数指针常被放在一起对照讲解,以区分两种不同的结合顺序[3]。
应用
内存管理是最常见的场景。malloc、calloc 等动态分配函数成功时返回一块可用内存的地址,失败时返回空指针,调用方据此判断申请结果[1]。链表、二叉树等结构在插入结点时,也常由创建结点的指针函数返回新结点地址,再挂接到已有结构上[7]。
字符串与数组处理中,返回指针可以避免复制整块数据。例如查找类函数直接返回匹配元素所在位置的地址,调用方通过该指针读写原数据[1]。在算法分发场景中,函数还可返回一个指向其他函数的指针,调用方先取到函数地址,再通过该地址执行具体的计算函数[2]。
在 C++ 中,返回指针的写法同样用于构造对象和申请数组,调用结束后需配合 delete 或 delete[] 手动释放,否则会形成内存泄漏[10]。
局限
最大的风险是返回指向局部变量的指针。函数返回时其栈帧被回收,局部变量所占空间随之失效,交回的地址已不对应有效对象,成为悬空指针[8][11]。这类错误往往不会立即暴露:刚返回时读到的数值可能仍然正确,但后续任何函数调用都可能覆盖该栈区,使结果变得不可预期[12]。
指针函数把有效性判断的责任交给了调用方。调用方若不解引用前检查是否为空、不核对指向对象是否仍有效,就可能访问已释放内存,导致程序崩溃、数据损坏乃至安全漏洞[13][8]。返回堆内存时,所有权归属也不由语言强制约束,极易出现忘记释放或重复释放[10]。
此外,不带长度信息的裸指针无法表达被指向内存的边界,越界访问难以被类型系统阻止;返回函数指针的声明形式层层嵌套,可读性差,通常需要借助 typedef 简化[2][14]。规避办法包括:不返回局部变量地址,必要时将变量声明为 static,释放内存后立即把指针置空,以及使用智能指针等手段自动管理生命周期[8]。
参见
参考资料
- 指针函数 [引用日期2026-10-29]
- 深入理解指针函数 [引用日期2026-10-29]
- 详解C语言指针函数、函数指针、函数指针数组「建议收藏」 [引用日期2026-10-29]
- C生万物 | 一探指针函数与函数指针的奥秘 [引用日期2026-10-29]
- C语言 函数指针和指针函数用法 [引用日期2026-10-29]
- 指针函数_百度百科 [引用日期2026-10-29]
- 清晰弄懂 函数 指针 与数组之间的关系 [引用日期2026-10-29]
- 迷途指针 [引用日期2026-10-29]
- 「C语言回顾之旅」第二篇:指针详解进阶 [引用日期2026-10-29]
- c++指针函数的定义及用法 [引用日期2026-10-29]
- [科普中国]-迷途指针 [引用日期2026-10-29]
- 迷途指針 [引用日期2026-10-29]
- 悬空指针 [引用日期2026-10-29]
- 【C语言航路】第六站:指针初阶(下) [引用日期2026-10-29]