假如想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量做参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。在函数调用实现字符串的复制。

解题思路:

定义一个函数 copy_string 用来实现字符串复制的功能,在主函数中调用此函数,函数的形参和实参可以分别用字符数组名或字符指针变量。分别编程,以供分析比较。

编写程序 1-1.c 用字符数组名作为函数参数,程序 1-2.c 用字符型指针变量作实参,程序 1-3.c 用字符指针变量作形参和实参

#include<stdio.h>
int main()
{void copy_string(char from[],char to[]);char a[] = "I am a teacher";char b[] = "You are a programmer";printf("string a=%s\nstring b=%s\n",a,b);printf("copy string a to string b:\n");copy_string(a,b);printf("\nstring a=%s\nstring b=%s\n",a,b);return 0;
}void copy_string(char from[],char to[])
{int i = 0;while(from[i]!='\0'){to[i] = from[i];i++;}to[i] = '\0';
}
copy

编写源程序 1-2.c:

**

#include<stdio.h>
int main()
{void copy_string(char from[],char to[]);char a[] = "I am a teacher";char b[] = "You are a programmer";char *from = a,*to = b;printf("string a=%s\n string b=%s\n",a,b);printf("copy string a to string b:\n");copy_string(from,to);printf("\n string a=%s\n string b=%s\n",a,b);return 0;
}
void copy_string(char from[],char to[])
{int i = 0;while(from[i]!='\0'){to[i] = from[i];i++;}to[i] = '\0';
}
copy

**
编写源程序 1-3.c:

#include<stdio.h>
int main()
{void copy_string(char from[],char to[]);char *a = "I am a teacher";char b[] = "You are a programmer";char *p = b;printf("string a=%s\n string b=%s\n",a,b);printf("copy string a to string b:\n");copy_string(a,p);printf("\n string a=%s\n string b=%s\n",a,b);return 0;
}void copy_string(char *from,char *to)
{for(;*from!='\0';from++,to++)*to = *from;*to = '\0';
}
copy

运行三个程序,可以看出,结果是一样的。
结果分析·

程序 1-1.c。将数组 a 复制到数组 b 后,未能全部覆盖 b 数组原有内容。b 数组最后 3 个元素仍保留原状。在输出 b 时由于按 %s 输出,遇到 ‘\0’ 就会结束,因此第一个 ‘\0’ 后的字符不输出。

程序 1-2.c。copy_string 不变,在 main 函数中定义字符指针变量 from 和 to,分别指向两个字符数组 a 和 b。 指针变量 from 的值是 a 数组首元素的地址,指针变量 to 的值是 b 数组首元素的地址。它们作为实参,把 a 数组首元素的地址和 b 数组首元素的地址传递给形参数组名 from 和 to(它们实质也是指针变量)。

程序 1-3.c。形参改用 char * 型变量(即字符指针变量)。在程序(1)和(2)中 copy_string 函数的参数用字符数组名,其实编译系统是把字符数组名按指针变量处理的,只是表示形式不同。

用字符数组和字符指针变量都能实现字符串的存储和运算,但它们两者之间是有区别的,主要为以下几点:

1.字符数组由若干元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。

2.赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。对字符指针变量赋值:

char *a;
a = "I love shiyanlou!";    //将字符串首元素地址赋给指针变量,合法。但是赋给a的不是字符串,只是一个字符串首元素的地址。

给a字符指针变量字符串首元素的地址,然后通过%s打印自动将地址加一,直到遇到‘\0’为止。

不能用以下办法对字符数组名赋值:

char str[14];
str[0] = 'I';                        //合法,对字符数组元素赋值
str = "I love Shiyanou";             //非法,数组名是地址,是常量,不能被赋值

3.存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元

c语言习题字符指针作函数参数相关推荐

  1. C语言—字符指针作函数参数 按如下函数原型编程实现字符串连接函数strcat()的功能。void MyStrcat(char *dstStr, char *srcStr);

    按如下函数原型编程实现字符串连接函数strcat()的功能. void  MyStrcat(char *dstStr, char *srcStr); 输入提示信息: "Input a str ...

  2. 习题 9.5 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。

    C++程序设计(第三版) 谭浩强 习题9.5 个人设计 习题 9.5 建立一个对象数组,内放5个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成 ...

  3. c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...

    www.shufadashi.com防采集. C语言编程:从键盘任意输入三个数,编写求其最大值.最小值的函数,用指针作函数参数实现.. #includevoid maxfunction(int*);v ...

  4. C++老话题:用指向函数的指针作函数参数

    用指向函数的指针作函数参数 在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参.这样就可以在调用一个函数的过程中根据给定的不同实参调用不同的函数. 例如,利用这种方法可 ...

  5. 用字符数组作函数参数编程实现如下功能:在字符串中删除与某字符相同的字符。

    用字符数组作函数参数编程实现如下功能:在字符串中删除与某字符相同的字符. **提示信息: "Input a string:" "Input a character:&qu ...

  6. [C语言]插入字符A:用字符数组作函数参数,编程实现在字符串每个字符间插入一个空格的功能。

    输入 输入一行字符,并且长度不超过20. 输出 输出插入后的字符串. 输入示例 Very good! 输出示例 V e r y g o o d ! 数据范围 输入输出均为字符串,并且输入字符串长度不超 ...

  7. 【C语言】用函数实现两个数排序(指针作函数参数)

    原理就不讲了,这里用来理解指针的使用方法 #include <stdio.h> void fun(int* a,int* b) {int t; if(*a>=*b){t = *a;* ...

  8. c语言使用指针改数组逆置,用指针作函数参数,编写函数,将一个整型数组中的元素全部逆置。...

    满意答案 singoboss 2013.06.16 采纳率:57%    等级:11 已帮助:3587人 先输入,然后逆序存放,再输出.#include"stdio.h"#defi ...

  9. C语言,字符串指针做函数参数

    看一下下面这段代码有什么问题? #include "stdio.h" //#include "stdbool.h" #include "string. ...

最新文章

  1. 华为开源只用加法的神经网络:实习生领衔打造,效果不输传统CNN | CVPR 2020 Oral...
  2. python英语-50 行代码,实现中英文翻译
  3. 固定资产制作修理费应如何入账
  4. 计算机小知识分享,分享几小个计算机操作技巧
  5. 解决office2007每次打开提示向程序发送命令时出现错误
  6. 想开发一个背单词的学习软件
  7. 《统计学习方法》(李航)读书笔记(完结)超级火爆的总结
  8. java拼图游戏Mian_Java拼图游戏源码 MainApp启动器 main(): 创建主界面类对 联合开发网 - pudn.com...
  9. centos7-每天定时备份 mysql数据库
  10. mq系列传感器的程序_Cooper Instruments传感器定制解决方案
  11. wiley 期刊Stix字体问题
  12. 计算机网络中报文摘要概念,报文摘要详细介绍
  13. 大学计算机考核方案,计算机学院学生量化考核评定细则.doc
  14. java罗马帝国下载,Java程序设计2020满分完整版考 试题库大全
  15. Java中如何通过经纬度坐标获取两个点之间的直线距离
  16. linux连接wifi的方法
  17. Linux内核升级(降级)
  18. BOS金蝶云星空开发简单账表
  19. thinkpadt410接口介绍_转:联想ThinkPad T410笔记本DisplayPort接口详解
  20. APA轨迹规划常见算法

热门文章

  1. t450+装linux+网卡驱动,ubuntu14.04如何手动安装无线网卡驱动(ThinkPad T450)
  2. 软件测试人员易遗漏的一些隐藏缺陷
  3. web安全——基础知识(计算机网络part1)
  4. Windows 2008 修改或取消密码安全策略
  5. python中的zip()方法
  6. C#/VB.NET语法的比较
  7. Word 2003操作技巧之改变默认字体及恢复方法
  8. 什么是聚合支付,哪家聚合支付比较好?
  9. head和tail命令
  10. mysql启动数据库进程_MySQL数据库启动报错的处理