c语言ch存放输入的字符,C语言ch通过指针引用字符串.ppt

C语言ch通过指针引用字符串.ppt

2018/12/26,1,上一节我们学到了,指针与二维数组 ai*ai aij**aij a、ai、*ai、ai、**aij等怎么理解 行指针与列指针 如何定义一个指向二维数组的指针 行指针指向一维子数组,int *p10; 列指针指向元素,int *p; 如何向函数传递一个指向二维数组的指针,2018/12/26,2,第8章 善于利用指针,8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.4.1 字符串的引用方式 8.4.2 字符指针作函数参数 8.4.3 使用字符指针变量和字符数组的比较 8.5 指向函数的指针 8.6 返回指针值的函数 8.7 指针数组和多重指针 8.8 动态内存分配与指向它的指针变量 8.9 有关指针的小结字符指针字符串(char *string) 字符串常量 strcpy源码,2018/12/26,3,2018/12/26,4,回忆字符串,一串以0结尾的字符在C语言中被看作字符串 字符串常量是用双引号括起的以0结束的一串字符。 在程序开始运行时分配在全局数据区的文字常量区,存储在无名数组中。 相同字符串常量只有一个副本。 C语言表示字符串的两种表示法 字符数组 字符指针,2018/12/26,5,代码区(code area),操作系统内核区,全局数据区,堆区heap,栈区stack,文字常量区,未初始化静态变量区,已初始化静态变量区,低址数据区,字符串常量,没有初始化的全局变量和静态变量,初始化的全局变量和静态变量,malloc free,局部变量,函数的二进制码,内存分配,2018/12/26,6,char string 例,例8.16 int main char string “I love China“; printf“cn“, string7; printf“sn“, string; 运行时输出 C I love China,2018/12/26,7,char* string 例,例8.17 int main char *string “I love China“; printf“sn“, string; 把存放字符串的无名数组的首地址赋给string。 char *string “I love China“; 等价于 char *string; string “I love China“;,2018/12/26,8,练习,下面各语句中,能正确进行字符串赋值操作的语句是( ) char s5 “ABCDE“; char s5 A,B,C,D,E s “ABCDE“; Q printf“sn“, “abc“1; 输出bc2018/12/26,9,8.4.2 字符指针作函数参数,例8.20 用函数调用实现字符串的复制。 1 用字符数组作参数。,2018/12/26,10,strcpy函数,/* Copies the string src into the spot specified by dest; assumes enough room. 目标指针空间必须大于源字符串空间。 在调用前请确认目标指针空间是否大于源字符串的空间。 */ void MyStrcpychar dstStr, char srcStr int i 0; while dstStri srcStri 0 i; ,2018/12/26,11int main char a16 “good good study“; char b16 “day day up“; char c30; MyStrcpyb, a; MyStrcpyc, “copy successfully”; printf“string asnstring bsnsn“, a, b, c; return 0; ,2018/12/26,12,在main函数中也可以用字符型指针变量作实参。 int main char a16 “good good study“; char b16 “day day up“; char *pa a, *pb b; printf“string asnstring bsnn“, pa, pb; MyStrcpypb, pa; printf“copy string a to string bnn“; printf“string asnstring bsn“, pa, pb; ,2018/12/26,13,字符指针做形参,void MyStrcpychar *dst, char *src while *dst*src 0 dst; src; ,2018/12/26,14进一步简化 while *dst *src;不推荐 等价于 while *dst *src 0; 推荐 函数体中while语句也可以改用for语句 for ;*dst*src0;dst,src; 推荐 等价于 for ;*dst*src;;不推荐,2018/12/26,15以上各种用法, 变化多端, 使用十分灵活, 初看起来不太习惯, 含义不直观。初学者会有些困难, 也容易出错。但对C熟练之后, 以上形式的使用是比较多的, 读者应看懂并逐渐熟悉它,。 软件简单为美(Keep It Simple Software,KISS)正确优于速度。简单优于复杂。清晰优于机巧。,2018/12/26,16,出现频率最高的笔试题,题目 已知strcpy函数的原型是 char * strcpychar * dest,const char * src; 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 char *strcpychar *dest,const char *src char *destsave dest; 1 assertdest;2 assertsrc;3 while *dest*src0; 4 return destsave; 2018/12/26,17,错误的做法,1 忘记保存原始的dest值,说明答题者逻辑思维不严密。mystrcpy执行到最后一行时dest已指向0后面的位置 2 利用断言检查指针的有效性,如不检查,说明答题者不注重代码的健壮性。 2、解释为什么要返回char * 实现链式表达式 char c20; char *pc c; mystrcpypc, mystrcpypb, pa;,2018/12/26,18,strlen,/*函数功能 计算字符串的长度 函数参数 字符型指针变量pStr,指向字符串 函数返回值字符串的长度 */ unsigned int MyStrlenchar *pStr unsigned int len 0; for ; *pStr0 return len; ,2018/12/26,19,FreeBSD的strlen源码, FreeBSD的strlen源码 size_t strlenconst char *str const char *s; for s str; *s; s; return s - str; ,2018/12/26,20,“char array” vs “char pointer”,赋值方式不同 输入方式不同 字符指针是变量,而字符数组名是常量 指针指向格式字符串,2018/12/26,21,1 赋值方式,对字符指针变量赋值 char *a“I love China“; 等价于 char *a; a“I love China“; 但注意赋给a的不是字符, 而是字符串的首地址。 而对数组的初始化 char str14 “I love China“;不能等价于 char str14; str “I love China“; 应为strcpystr, “I love China“;,2018/12/26,22,char str10; scanf“s“, str; 是可以的 而 char *p; scanf“s“, p; 是危险的。 应当这样 char *p, str10; p str; scanf“s“, p; 先使p指向一个字符数组, 把输入的字符串存放在以该地址开始的数组中。,2 输入方式,2018/12/26,23,3 指针变量的值是可以改变的 char *p “I love China“; p p 7; printf“s“, p; 运行结果如下 China 输出字符串时从p当时所指向的单元开始输出各个字符, 直到遇0为止。 而数组名的值是不能改变的。下面是错误的 char str“I loveChina“; str str 7; printf“s“, str;,3 字符指针是变量,而字符数组名是常量,2018/12/26,24,可以用下标形式引用字符串中的字符。如 int main char *p“I love China“; int i; printf“The sixth character is cn“, p5; printf“sn”,p; ,2018/12/26,25,4 指针指向格式字符串,char *at “ad, bdn“; printfat, a, b; 相当于 printf“ad, bdn“, a, b; 实际上字符串常量就是一个指针,是指向存储该字符串的无名字符数组的指针。,2018/12/26,26也可以用字符数组实现。如 char at “ad, bdn“; printfat, a, b; 但由于不能采用赋值语句对数组整体赋值, 如 char at; at “ad, bdn“; 因此用指针变量表示字符串的方式更为方便。,2018/12/26,272018/12/26,282018/12/26,292018/12/26,30,这一节我们学到了,字符串常量 C语言中字符串的表示方式 字符数组 字符指针 const char *p “Hello“; 字符指针作函数参数 字符指针和字符数组的比较,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值