版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言_通过指针引用字符串2021-7-121 上一节我们学到了上一节我们学到了 n指针与二维数组指针与二维数组 nai*(a+i) naij*(*(a+i)+j) na、a+i、*(a+i)、ai、*(*(a+i)+j)等怎么理解等怎么理解 n行指针与列指针行指针与列指针 n如何定义一个指向二维数组的指针如何定义一个指向二维数组的指针 n行指针:行指针:指向一维子数组,指向一维子数组,int (*p)10; n列指针:指向元素,列指针:指向元素,int *p; n如何向函数传递一个指向二维数组的指针如何向函数传递一个指向二维数组的指针 C语言_通过指针引用字符串2021-7-122 第第8章
2、章 善于利用指针善于利用指针 n8.1 指针是什么指针是什么 n8.2 指针变量指针变量 n8.3 通过指针引用数组通过指针引用数组 n8.4 通过指针引用字符串通过指针引用字符串 n8.5 指向函数的指针指向函数的指针 n8.6 返回指针值的函数返回指针值的函数 n8.7 指针数组和多重指针指针数组和多重指针 n8.8 动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量 n8.9 有关指针的小结有关指针的小结 C语言_通过指针引用字符串 n字符指针字符串(字符指针字符串(char *string) n字符串常量字符串常量 nstrcpy源码源码 2021-7-123 C语言_通过指
3、针引用字符串2021-7-124 回忆字符串回忆字符串 n一串以一串以0结尾的字符在结尾的字符在C语言中被看作字符串语言中被看作字符串 n字符串常量是用双引号括起的字符串常量是用双引号括起的以以0结束结束的一的一 串字符。串字符。 n在程序开始运行时分配在全局数据区的文字常在程序开始运行时分配在全局数据区的文字常 量区,存储在无名数组中。量区,存储在无名数组中。 n相同字符串常量只有一个副本。相同字符串常量只有一个副本。 nC语言语言表示字符串的两种表示法表示字符串的两种表示法 n字符数组字符数组 n字符指针字符指针 C语言_通过指针引用字符串2021-7-125 代码区(代码区(code a
4、rea) 操作系统内核区操作系统内核区 全局数据区全局数据区 堆区堆区heap 栈区栈区stack 文字常量区文字常量区 未初始化静态变量区未初始化静态变量区 已初始化静态变量区已初始化静态变量区 低址低址 数数 据据 区区 字符串常量 没有初始化的全局变量和静态变量 初始化的全局变量和静态变量 malloc() free() 局部变量 函数的二进制码 内存分配内存分配 C语言_通过指针引用字符串2021-7-126 char string 例例 n例例8.16 int main() char string = I love China!; printf(%cn, string7); prin
5、tf(%sn, string); 运行时输出:运行时输出: C I love China! C语言_通过指针引用字符串2021-7-127 char* string 例例 n例例8.17 int main() char *string = I love China!; printf(%sn, string); n把存放字符串的无名数组的首地址赋给把存放字符串的无名数组的首地址赋给string。 nchar *string = I love China!; 等价于:等价于: char *string; string = I love China!; C语言_通过指针引用字符串2021-7-128
6、 练习练习 n下面各语句中,能正确进行字符串赋值操作的语句是下面各语句中,能正确进行字符串赋值操作的语句是 ( ) char s5 =ABCDE; char s5 =A,B,C,D,E; char *s;s=ABCDE; char *s;scanf(%s, s); char s8; s = ABCDE; nQ: printf(%sn, abc+1); n输出:输出:bc C语言_通过指针引用字符串2021-7-129 n例例8.20 用函数调用实现字符串的复制。用函数调用实现字符串的复制。 (1) 用字符数组作参数。用字符数组作参数。 C语言_通过指针引用字符串2021-7-1210 strc
7、py函数函数 /* Copies the string src into the spot specified by dest; assumes enough room. 目标指针空间必须大于源字符串空间。目标指针空间必须大于源字符串空间。 在调用前请确认目标指针空间是否大于源字符串的空间。在调用前请确认目标指针空间是否大于源字符串的空间。 */ void MyStrcpy(char dstStr, char srcStr) int i = 0; while (dstStri = srcStri) != 0) +i; C语言_通过指针引用字符串2021-7-1211 int main() ch
8、ar a16 = good good study; char b16 = day day up; char c30; MyStrcpy(b, a); MyStrcpy(c, “copy successfully”); printf(string a:%snstring b:%sn%sn, a, b, c); return 0; C语言_通过指针引用字符串2021-7-1212 n在在main函数中也可以用字符型指针变量作实参。函数中也可以用字符型指针变量作实参。 int main() char a16 = good good study; char b16 = day day up; char
9、 *pa = a, *pb = b; printf(string a:%snstring b:%snn, pa, pb); MyStrcpy(pb, pa); printf(copy string a to string bnn); printf(string a:%snstring b:%sn, pa, pb); C语言_通过指针引用字符串2021-7-1213 字符指针做字符指针做形参形参 void MyStrcpy(char *dst, char *src) while (*dst=*src)!= 0) +dst; +src; C语言_通过指针引用字符串2021-7-1214 n进一步简
10、化进一步简化 while (*dst+ = *src+);不推荐不推荐 等价于等价于 while (*dst+ = *src+)!= 0); 推荐推荐 n函数体中函数体中while语句也可以改用语句也可以改用for语句:语句: for (;(*dst=*src)!=0;+dst,+src); 推荐推荐 等价于等价于 for (;*dst+=*src+;);不推荐不推荐 C语言_通过指针引用字符串2021-7-1215 n以上各种用法以上各种用法, 变化多端变化多端, 使用十分灵活使用十分灵活, 初看起来初看起来 不太习惯不太习惯, 含义不直观。初学者会有些困难含义不直观。初学者会有些困难, 也
11、容也容 易出错。但对易出错。但对C熟练之后熟练之后, 以上形式的使用是比较以上形式的使用是比较 多的多的, 读者应看懂读者应看懂并逐渐熟悉它并逐渐熟悉它,。 n软件简单为美(软件简单为美(Keep It Simple Software,KISS):): 正确优于速度。简单优于复杂。清晰优于机巧。正确优于速度。简单优于复杂。清晰优于机巧。 C语言_通过指针引用字符串2021-7-1216 出现频率最高的笔试题出现频率最高的笔试题 n题目:题目: 已知已知strcpy函数的原型是:函数的原型是: char * strcpy(char * dest,const char * src); 1.不调用库
12、函数,实现不调用库函数,实现strcpy函数。函数。 2.解释为什么要返回解释为什么要返回char *。 nchar *strcpy(char *dest,const char *src) char *destsave = dest; /1 assert(dest);/2 assert(src);/3 while (*dest+=*src+)!=0); /4 return destsave; C语言_通过指针引用字符串2021-7-1217 错误的做法错误的做法 n1 忘记保存原始的忘记保存原始的dest值,说明答题者逻辑思维不严值,说明答题者逻辑思维不严 密。密。mystrcpy执行到最后一
13、行时执行到最后一行时dest已指向已指向0后面的后面的 位置位置 n2 利用断言检查指针的有效性,如不检查,说明答题利用断言检查指针的有效性,如不检查,说明答题 者不注重代码的健壮性。者不注重代码的健壮性。 n2、解释为什么要返回、解释为什么要返回char * n实现链式表达式实现链式表达式 char c20; char *pc = c; mystrcpy(pc, mystrcpy(pb, pa); C语言_通过指针引用字符串2021-7-1218 strlen /*函数功能:函数功能: 计算字符串的长度计算字符串的长度 函数参数:函数参数: 字符型指针变量字符型指针变量pStr,指向字符串,
14、指向字符串 函数返回值:字符串的长度函数返回值:字符串的长度 */ unsigned int MyStrlen(char *pStr) unsigned int len = 0; for (; *pStr!=0; pStr+) len+; return len; C语言_通过指针引用字符串2021-7-1219 FreeBSD的的strlen源码源码 / FreeBSD的的strlen源码源码 size_t strlen(const char *str) const char *s; for (s = str; *s; +s); return (s - str); C语言_通过指针引用字符串2
15、021-7-1220 “char array” vs “char pointer” n 赋值方式不同赋值方式不同 n 输入方式不同输入方式不同 n 字符指针是变量,而字符数组名是常量字符指针是变量,而字符数组名是常量 n 指针指向格式字符串指针指向格式字符串 C语言_通过指针引用字符串2021-7-1221 (1) 赋值方式赋值方式 n对字符指针变量赋值对字符指针变量赋值 char *a=I love China!; 等价于等价于 char *a; a=I love China!; 但注意赋给但注意赋给a的不是字符的不是字符, 而是字符串的首地址。而是字符串的首地址。 n而对数组的初始化:而对
16、数组的初始化: char str14 = I love China!;不能等价于不能等价于 char str14; str = I love China!; 应为:应为:strcpy(str, I love China!); C语言_通过指针引用字符串2021-7-1222 char str10; scanf(%s, str); 是可以的是可以的 n而而 char *p; scanf(%s, p); 是危险的。是危险的。 n应当这样:应当这样: char *p, str10; p = str; scanf(%s, p); 先使先使p指向一个字符数组指向一个字符数组, 把输入的字符串存放在以该地
17、址开把输入的字符串存放在以该地址开 始的数组中。始的数组中。 (2) 输入方式输入方式 C语言_通过指针引用字符串2021-7-1223 (3) 指针变量的值是可以改变的指针变量的值是可以改变的 char *p = I love China!; p = p + 7; printf(%s, p); n运行结果如下:运行结果如下: China! n输出字符串时从输出字符串时从p当时所指向的单元开始输出各个字符当时所指向的单元开始输出各个字符, 直直 到遇到遇0为止。为止。 n而数组名的值是不能改变的。下面是错误的:而数组名的值是不能改变的。下面是错误的: char str=I loveChina!
18、; str = str + 7; printf(%s, str); (3) 字符指针是变量,而字符数组名是常量字符指针是变量,而字符数组名是常量 C语言_通过指针引用字符串2021-7-1224 n可以用下标形式引用字符串中的字符。如:可以用下标形式引用字符串中的字符。如: int main() char *p=I love China!; int i; printf(The sixth character is %cn, p5); printf(“%sn”,p); C语言_通过指针引用字符串2021-7-1225 (4) 指针指向格式字符串指针指向格式字符串 char *format = a=%d, b=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海洋石油平台燃气安全应急方案
- 外墙干挂石材施工监理方案
- 制造业机械故障应急响应方案
- 医院护理人员工作职责与管理制度
- 学校疫情防控外出报备制度
- XX省电力公司2020年度员工技能提升方案
- 2024年设备购销协议模板(专业)
- 2024高层建筑消防工程专项施工协议
- 2024年劳动法规定劳动协议格式
- 承包协议追加条款:2024年限定事项
- 防护栏生命工程监理实施细则全解
- 环甲膜穿刺术PPT课件
- 长轨运输 - T11长轨列车收轨作业
- 众筹投资优秀合同模板
- 《新闻纪录片创作》教学大纲
- 信号频谱分析专科复习习题集
- 新风系统工程报价清单明细表
- 表一、博物馆基本情况调查表
- 高光谱遥感复习总结
- DB3710∕T 158-2021 电梯按需维保规范
- 话剧基础知识ppt课件
评论
0/150
提交评论