指针函数及递归函数学习(1)

指针函数是指一个函数的返回值为地址量函数。
格式:
<数据类型> * <函数名称>(<参数名称>){
语句序列;}
注意:有关指针函数的问题,形参地址与实参地址容易概念混淆,切记长心!
一旦函数执行结束,自动变量的内存空间就会被释放。
例如下边的程序:
char * int_to_str(int int_value){
char buf[20];
sprintf(buf,"%d",int_value);
return buf;
}
这个程序是错误的;
原因是:自动变量buf的内存区域在函数执行结束后就被释放。
解决方法:1,我们可以把buf声明成静态变量;
static char buf[20];
这样buf的内存区域一直会被静态的保持,即使函数执行结束,buf的内存区域也不会被释放。
静态变量的详解 博客园 SilenceBook(https://www.cnblogs.com/getyoulove/p/3656184.html)
2,我们也可以把buf[20]设置成全局变量;但是既然数组已经是全局变量,直接在main函数中就可以访问,而在方法中返回,显得画蛇添足!
3,直接设置成字符串常量,这样数据就被放到了静态存储区,不会在函数执行结束后销毁。
总结:这三种方法其实都是把数组中的数据通过各种方式放在了静态存储区,避免函数销毁而丢失。
指针函数的返回值:

  1. 全局变量的地址。
  2. static变量的地址。
  3. 字符串常量的地址。

问题一:运用指针函数实现字符串去空格;
代码如下:
char *dele_k(char *);
int main(int argc, char *argv[]) {
char s[]=“sa df sfd sa asas”;
char *p;
p=dele_k(s);
printf(“去掉空格后的字符串:%s\n”,p);
puts(s);
return 0;
}
char *dele_k(char *p){
char *q;
char *d=p;
q=p;
while(*p){
if(*p==’ ‘){
p++;
}else{
*q=*p;
q++;
p++;
}
}
*q=’\0’;
return d;
}

运行结果如上
注意在指针函数的while循环后边添加一句*q=’\0’,不然原字符串在q后p前的数据依然存在,返回保留在原数组当中,加’\0’使前边构成一个完整的字符串。
问题二:运用指针函数实现字符串的连接;
代码如下:
char * zfclx(char *a,const char *b);
int main(int argc, char *argv[]) {
char m[100]=“asfakgfaf”;
char n[]=“qwdw57689ars”;
char *z;
z=zfclx(m,n);
puts(zfclx(m,n));
printf(“输出连接后的字符串:%s”,z);
return 0;
}
char * zfclx(char *a,const char *b){
char *p;
p=a;
while(*a){
a++;
}
while(*b){
*a=*b;
b++;
a++;
}
*a=’\0’;
return p;
}

运行结果如上

在zfclx函数中的代码可以简化如下:
char * zfclx(char *a,const char *b){
char *p=a;
while(a++);
//++优先级高于指针 ++在后先赋值,在++。所以当
a++为\0时,a已经在\0的后一位。
a–;
while(*b){
*a++=*b++;
}
*a=’\0’;
return p;
}

最简洁方式如下:
char * zfclx(char *a,const char *b){
char *p=a;
while(*a++=*b++);
return p;
}

猜你喜欢

转载自blog.csdn.net/qq_36942291/article/details/86661312
今日推荐