
上QQ阅读APP看书,第一时间看更新
9.5.3 返回指针值的函数
C语言中,一个函数可以直接用“return;”来表示该函数不返回值,也可以用return后面带一个值的写法来返回一个值。
一般从函数中返回的值类型比较普遍和好理解的是一些简单类型,如整型、字符型、实型等,其实也可以返回指针型数据,也就是地址,虽然这种情形用得不多,但还是要提及一下,以免日后看到这些写法时感到困惑。
返回指针值的函数的一般定义形式为:

看看下面这行函数定义代码:

这里务必要看清楚,a作为函数名,因为()优先级高于“*”,因此a先与()结合,所以整个代码其实就是一个函数定义,返回的类型为指针类型。
看看如下范例,这段代码写法存在致命问题,请详细看代码中的注释:

上面这段代码之所以不稳定、不安全,主要原因是从add函数中返回的地址已经被系统回收,此时,无论是往该地址中写数据还是从该地址中读数据都不可以,都会存在隐患,严重时甚至会导致程序崩溃。
解决这种问题的方法其实比较多,这里介绍一种解决方法,那就是使用全局变量。程序改造如下:

其实,只要掌握了基本的指针概念,则万变不离其宗,怎么变都不会糊涂。