一.指针函数的定义和使用
1.定义:一个函数的返回值为地址量(指针)的函数
指针函数的定义的一般形式如下:
<数据类型> * <函数名称>(<参数说明>)
{ 语句序列;}
一般指针函数返回值为: 全局变量的地址 / static变量的地址 /字符串常量的地址/堆的地址
指针函数不能返回局部变量的地址
示例程序:
分析:
在警告中可以看到,提示返回的是一个局部变量的地址,程序执行的结果是乱码;
mystring()是一个指针函数,返回的是数组的地址,但是,s数组是一个这个指针函数的局部数组,局部变量是分配在栈中的。当函数执行完后,地址仍然存在,但是地址内容已经被释放了。访问一段已经释放的内存是非法操作,所以是乱码,所以这个时候不能访问地址中的内容;
根据以上分析我们可以做以下更改:
分析:
因为静态变量只有在程序结束后才会回收内存,所以我们用static将局部数组变成了静态数组,这样在main函数中我们就可以在mystring()函数结束后访问s数组的内容;
同理 也可以把程序做以下更改:
分析:
字符串常量的内存也是在程序结束之后才会被回收,因此可以在指针函数中返回一个字符串常量的地址,main函数依然能够访问;
二.指针函数程序举例
⭕c语言中很多字符串函数都是指针函数
1.实现字符串拷贝函数
代码示例如下:
分析:在strcpy函数内借助一个p指针来记录传进来数组的初始地址,无论后面这个数组地址怎么变,也有p指针记录下了最初的地址;由于传进来的这个s数组是在main函数中定义的,所以,虽然在strcpy中使用过了,但是main函数还没有结束,这块内存没有被释放,所以p返回的地址内容仍然可以被访问;
在strcpy中把s1全部复制到s中去以后,要在结尾加‘\0’,表示结束,这样既在逻辑上加上了结束符,也让s中比s1多余的部分舍弃掉,只会存下s1长度的内容;
2.实现strcat
代码示例如下:
3.编写一个指针函数, 删除一个字符串中的空格
代码示例如下:
4.编写一个指针函数,把整数123转化成字符串”123”