【难点回顾】指针函数

文/Edward
今天开始,我们将来介绍C语言里面最让人头痛的两个东西,指针函数和指向函数的指针。
指针函数这个名字乍一看非常唬人,又是指针又是函数的,但是其实它并没有想象的那么复杂,千万别被它的名字吓到了。所谓的指针函数,说白了就是一个返回值为指针的函数。其定义形式为:
数据类型 *函数名(形式参数1,形式参数2,……形式参数n);
指针函数其实类似于我们之前讲述的利用指针类型的形式参数传递返回值,由于C语言早已经规定了一个函数只有一个返回值,但是当我们需要让一个函数返回出多个返回值的时候,可以让它返回一个指针。其实指针函数配合我们后续将要学习的结构体效果更加,而本小节我们使用指针函数来返回一个指向数组的类型。
假设我们需要写一个函数实现一个功能,将一个数组中的所有元素全部取反,然后输出。要实现这个功能对于现在来说已经非常简单了,我们只要使用之前学过的指针类型形式参数将结果传递出来即可,实现代码如图1所示。
图1 利用指针参数传递多个结果
这种用法有一个比较不明了的地方,就是它利用参数的形式把函数结果传递出来,对于某些强迫症患者来说比较虐心。那么使用指针函数是否就可以解决这个问题了呢?。如图2所示。
图2 利用指针函数传递多个结果
我们可以将运算的结果直接利用指针函数返回的指针返回出来。虽然理想很美好,但是显示肯定是残酷的,因为这种方法根本实现不了数组的返回。这是因为当我们返回一个指针的时候,它所指向的数组ret_array是一个临时变量定义的数组,因此一旦当函数退出时,这一块内存立即被编译器回收,所以得到的结果会和我们期望的南辕北辙。
要解决这个问题其实也很简单,我们只需要将函数中用以存储结果的数组声明成静态的即可,如图3所示。
图3 利用指针函数传递多个结果
虽然我们可以利用指针函数实现我们想要的结果,但是由于其返回的是一个地址,因此想要结果得以正常返回,一定要保证这个地址是唯一且永远存在的,因而一定要定义静态类型的变量来存放这个地址。正由于这个原因,函数指针用起来其实非常容易出错,因此就连C语言库函数都很少用这种方式去传递函数结果。我们以后如果要传递回来多个结果时,一定要利用指针类型的形式参数去传递,而返回值只做一个函数运算结果的状态。
(0)

相关推荐