找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2747|回复: 0
打印 上一主题 下一主题
收起左侧

字符串指针作函数参数

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-24 19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:
实参形参
1数组名数组名
2数组名字符指针变量
3字符指针变量字符指针变量
4字符指针变量数组名
[例] 用函数调用实现字符串的复制。
(1)用字符数组作参数。
voidcopy_string(char from[], char to[])
{int i=0;
while(from != '\0')
{ to = from; i++; }
to = '\0';
}
main()
{char a[] = "I am a teacher.";
char b[] = "you are a student.";
printf("string_a =%s\n string_b =%s\n", a,b);
copy_string(a,b);
printf("string_a =%s\n string_b =%s\n", a,b);
}
main()函数可以改写为(使用字符指针):
main()
{char *a = "I am a teacher.";
char *b = "you are a student.";
printf("string_a =%s\n string_b =%s\n", a,b);
copy_string(a,b);
printf("string_a =%s\n string_b =%s\n", a,b);
}
(2)形参用字符指针。
void(char *from, char *to)
{
for(; *form != '\0'; from++, to++)
   *to = *from;
*to = '\0';
}
main()
{char *a = "I am a teacher.";
char *b = "you are a student.";
printf("string_a =%s\n string_b =%s\n", a,b);
copy_string(a,b);
printf("string_a =%s\n string_b =%s\n", a,b);
}
(3)对copy_string函数的几种简化
void copy_string(char *from, char *to)
{
while((*to=*from) !='\0')
   {to++; from++}
}

*to=*from是一个赋值表达式,其值等于*from。to++和from++分别使指针指向下一个字节。
先执行赋值表达式,再判赋值表达式的值(等于*from)是否为'\0',因此,from串中的结尾字符'\0'被赋值给to。
voidcopy_string(char *from, char *to)
{
while((*to++=*from++) != '\0');
}

*to++=*from++先执行*to=*from,再使to、from分别加1。
voidcopy_string(char *from, char *to)
{
while(*from != '\0')
*to++ = *from++;
*to = '\0';
}
当遇到*from='\0'时,不执行赋值运算*to++=*from++,因此,最后应加一句*to='\0'。
voidcopy_string(char *from, char *to)
{
while(*to++=*from++);
}

与第②种简化相同,当*from='\0'时,表达式*to++=*from++的值等于'\0'(假),结束while循环。
voidcopy_string(char *from, char *to)
{
for(;(*to++ =*from++) !=0;);
for(;*to++ =*from++;);
}
⑤ for循环的结束条件是表达式*to++ =*from++的值(即*from的值)等于'\0'。且form中的'\0'已被赋给to。注意'\0'的ASCII码是不是0。
voidcopy_string(char from[], char to[])
{char *p1, *p2;
p1 = from; p2 = to;
while((*p2++=p1++) !='\0')
}

形参用数组,使用局部指针变量指向形参数组。


(4).字符串指针作函数的参数
字符串指针作函数的参数,与前面介绍的数组指针作函数参数没有本质的区别,函数间传递的都是地址值,所不同的仅是指针指向对象的类型不同而已。
例5 用字符串指针作函数参数,将输入的一个字符串复制到另一个字符串中(重点例题)。
#include "stdio.h"
main()
{
void copy_s(char *,char *);   
char a[20],b[30];
gets(a);                  
copy_s(a,b);               
puts(b);                  
}
void copy_s(char *str1,char *str2)
{
while((*str2=*str1)!='\0')
    {
     str1++;
     str2++;
    }
}
程序在主函数中定义了两个字符数组a和b,a数组由gets()函数获得,b数组通过调用copy_s()函数自动生成。copy_s()函数有两个指向字符串的形参,其功能是将str1指向的字符串复制到str2中。
copy_s()函数体由一个while语句构成,其条件表达式“(*str2=* str 1)!='\0'”的计算过程是:先进行赋值*str2=*str1,将指针str1的内容送到指针str2指向的存储位置,然后再判断所赋值的字符是否是串结束标记'\0'。若条件表达式成立,即当前复制的字符不是串结束标记,则继续循环,复制下一个字符;否则,退出循环,完成串复制。
在主函数中调用copy_s()函数时,必须注意两个实参地址的顺序,第一个实参是原始字符串首地址,第二个实参是目标字符串首地址。本程序调用时使用的是存储两个字符串的字符数组名。当然,在函数调用时,也可以直接使用字符串指针变量作函数实参,如下是修改后的main()函数:
main()
{
void copy_s(char *,char *);
char a[20],b[30],*pa=a,*pb=b;
gets(pa);      
copy_s(pa,pb);              
puts(pb);                  
}
事实上,这种使用字符串的方法在C语言程序中更为常用。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表