标题: 字符串指针作函数参数 [打印本页]
作者: hongniu 时间: 2015-6-24 19:08
标题: 字符串指针作函数参数
将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:
| 实参 | 形参 |
1 | 数组名 | 数组名 |
2 | 数组名 | 字符指针变量 |
3 | 字符指针变量 | 字符指针变量 |
4 | 字符指针变量 | 数组名 |
[例] 用函数调用实现字符串的复制。
(1)用字符数组作参数。
void | copy_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。
|
void | copy_string(char *from, char *to) | { | | | while((*to++=*from++) != '\0'); | } | |
| ②
*to++=*from++先执行*to=*from,再使to、from分别加1。
|
void | copy_string(char *from, char *to) | { | | | while(*from != '\0') | | *to++ = *from++; | | *to = '\0'; | } | |
| ③ 当遇到*from='\0'时,不执行赋值运算*to++=*from++,因此,最后应加一句*to='\0'。
|
void | copy_string(char *from, char *to) | { | | | while(*to++=*from++); | } | |
| ④
与第②种简化相同,当*from='\0'时,表达式*to++=*from++的值等于'\0'(假),结束while循环。
|
void | copy_string(char *from, char *to) | { | | | for(;(*to++ =*from++) !=0;); | 或 | for(;*to++ =*from++;); | } | |
| ⑤ for循环的结束条件是表达式*to++ =*from++的值(即*from的值)等于'\0'。且form中的'\0'已被赋给to。注意'\0'的ASCII码是不是0。
|
void | copy_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语言程序中更为常用。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |