指针函数想必大家都知道指针函数、但是感觉在最基础的C代码程序开发中用到的却很少。花费了一段时间进行了一些总结。感兴趣的可以互相学习一下。共同进步!话不多说直接进入主题 。
概念及函数构成
- 指针函数是指一个函数的 返回值为地址量 的函数
- 指针函数定义的一般形式如下:
<数据类型> * <函数名称>(<参数说明>)
{
语句序列;
}
例如指针函数的声明:
int * func(int x,int y);
接下来分析一个题目,查找一下哪里存在问题
#include<stdio.h>
#include<string.h>
char * getstring();
int main (void)
{
printf("---%s---",getstring());
return 0;
}
char * getstring()
{
char str[20];
strcpy(str,"hello world\n");
return str;
}
上边这个示例的问题出在是在函数getstring()返回值是一个字符串的地址,但是返回的变量是一个局部变量,局部变量在函数执行完成之后,就会释放指针变量占用的内存。而在主函数中调用函数时,此内存地址就可能会被其他地方再次占用,打印出的数据就不是自己想要的结果。
最简单的修改办法有以下三种方式:
- 将定义的数组修改为全局变量。
- 将定义的数组定义为静态变量:static char str[20];
- 定义一个字符串常量存放数据:char *str = “hello world”;
运行结果:
---hello world---
总结
指针函数的返回值:是以下几种情况可以返回。
- 全局变量的地址
- static 变量的地址
- 字符串常量的地址
例1:编写一个指针函数实现将一个字符串的空格删除
#include<stdio.h>
#include<string.h>
char * del_space(char * data);//函数声明
int main(void)
{
char str[] = "how are you !";
puts(str);//打印函数删除空格之前的字符串
del_space(str);//调用函数
puts(str);//打印函数删除空格之前的字符串
return 0;
}
char * del_space(char * data)
{
char *p;
char *r;
r = data;//记录传进来的指针变量的起始地址
p = data;//输入的指针变量传入新定义的指针变量
while(*data)//判断地址上的每一位数不等于'\0'是进入循环0
{
if(*data != ' ')
{
*p = *data;//地址上的值不是空格时,将其中内容放到新的指针变量内
data++;//指针地址增加
p++;//指针地址增加
}
else
{
data++;//指针地址增加
}
}
*p = '\0';//在去除空格的新的字符串的结尾加入字符'\0'结束字符串。
return r;
}
运行结果:
how are you !
howareyou!
例2:使用指针函数编写一个代码实现两个字符串的连接
#include<stdio.h>
#include<string.h>
char * mstrcat(char * dest,const char *src);//函数声明
int main(void)
{
char dest[] = "How are you ,";
char src[] = "Nice too meet you!";
puts(mstrcat(dest,src));//调用函数并进行打印
return 0;
}
char * mstrcat(char * dest,const char *src)
{
char *dest_new;
dest_new = dest;
while(* dest)
{
dest++;//首先循环使地址指针指向dest字符串的末尾
}
while(*src)
{
*dest = *src;//在dest字符串末尾添加src字符串的第一个字符
dest++;//指针地址移动
src++;//指针地址移动
}
*dest = '\0';//在新的字符串的结尾加入字符'\0'结束字符串。
return dest_new;
}
运行结果:
How are you ,Nice too meet you!