您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > C语言-ch08-4-通过指针引用字符串
2020/3/31上一节我们学到了指针与二维数组a[i]=*(a+i)a[i][j]=*(*(a+i)+j)a、a+i、*(a+i)、a[i]、*(*(a+i)+j)等怎么理解行指针与列指针如何定义一个指向二维数组的指针行指针:指向一维子数组,int(*p)[10];列指针:指向元素,int*p;如何向函数传递一个指向二维数组的指针2020/3/32第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源码2020/3/332020/3/34回忆字符串一串以'\0'结尾的字符在C语言中被看作字符串字符串常量是用双引号括起的以‘\0’结束的一串字符。在程序开始运行时分配在全局数据区的文字常量区,存储在无名数组中。相同字符串常量只有一个副本。C语言表示字符串的两种表示法字符数组字符指针2020/3/35代码区(codearea)操作系统内核区全局数据区堆区heap栈区stack文字常量区未初始化静态变量区已初始化静态变量区低址数据区字符串常量没有初始化的全局变量和静态变量初始化的全局变量和静态变量malloc()free()局部变量函数的二进制码内存分配2020/3/36char[]string例例8.16intmain(){charstring[]=IloveChina!;printf(%c\n,string[7]);printf(%s\n,string);}运行时输出:CIloveChina!2020/3/37char*string例例8.17intmain(){char*string=IloveChina!;printf(%s\n,string);}把存放字符串的无名数组的首地址赋给string。char*string=IloveChina!;等价于:char*string;string=IloveChina!;2020/3/38练习下面各语句中,能正确进行字符串赋值操作的语句是()①chars[5]={ABCDE};②chars[5]={'A','B','C','D','E'};③char*s;s=ABCDE;④char*s;scanf(%s,s);⑤chars[8];s=ABCDE;Q:printf(%s\n,abc+1);输出:bc③2020/3/398.4.2字符指针作函数参数例8.20用函数调用实现字符串的复制。(1)用字符数组作参数。2020/3/310strcpy函数/*Copiesthestringsrcintothespotspecifiedbydest;assumesenoughroom.目标指针空间必须大于源字符串空间。在调用前请确认目标指针空间是否大于源字符串的空间。*/voidMyStrcpy(chardstStr[],charsrcStr[]){inti=0;while((dstStr[i]=srcStr[i])!='\0'){++i;}}2020/3/311intmain(){chara[16]=goodgoodstudy;charb[16]=daydayup;charc[30];MyStrcpy(b,a);MyStrcpy(c,“copysuccessfully”);printf(stringa:%s\nstringb:%s\n%s\n,a,b,c);return0;}2020/3/312在main函数中也可以用字符型指针变量作实参。intmain(){chara[16]=goodgoodstudy;charb[16]=daydayup;char*pa=a,*pb=b;printf(stringa:%s\nstringb:%s\n\n,pa,pb);MyStrcpy(pb,pa);printf(copystringatostringb\n\n);printf(stringa:%s\nstringb:%s\n,pa,pb);}2020/3/313字符指针做形参voidMyStrcpy(char*dst,char*src){while((*dst=*src)!='\0'){++dst;++src;}}2020/3/314进一步简化while(*dst++=*src++);不推荐等价于while((*dst++=*src++)!=′\0′);推荐函数体中while语句也可以改用for语句:for(;(*dst=*src)!=0;++dst,++src);推荐等价于for(;*dst++=*src++;);不推荐2020/3/315以上各种用法,变化多端,使用十分灵活,初看起来不太习惯,含义不直观。初学者会有些困难,也容易出错。但对C熟练之后,以上形式的使用是比较多的,读者应看懂并逐渐熟悉它,。软件简单为美(KeepItSimpleSoftware,KISS):正确优于速度。简单优于复杂。清晰优于机巧。2020/3/316出现频率最高的笔试题题目:已知strcpy函数的原型是:char*strcpy(char*dest,constchar*src);1.不调用库函数,实现strcpy函数。2.解释为什么要返回char*。char*strcpy(char*dest,constchar*src){char*destsave=dest;//[1]assert(dest);//[2]assert(src);//[3]while((*dest++=*src++)!='\0');//[4]returndestsave;}2020/3/317错误的做法[1]忘记保存原始的dest值,说明答题者逻辑思维不严密。mystrcpy执行到最后一行时dest已指向'\0'后面的位置[2]利用断言检查指针的有效性,如不检查,说明答题者不注重代码的健壮性。2、解释为什么要返回char*实现链式表达式charc[20];char*pc=c;mystrcpy(pc,mystrcpy(pb,pa));2020/3/318strlen/*函数功能:计算字符串的长度函数参数:字符型指针变量pStr,指向字符串函数返回值:字符串的长度*/unsignedintMyStrlen(char*pStr){unsignedintlen=0;for(;*pStr!='\0';pStr++){len++;}returnlen;}2020/3/319FreeBSD的strlen源码//FreeBSD的strlen源码size_tstrlen(constchar*str){constchar*s;for(s=str;*s;++s);return(s-str);}2020/3/320“chararray”vs“charpointer”1.赋值方式不同2.输入方式不同3.字符指针是变量,而字符数组名是常量4.指针指向格式字符串2020/3/321(1)赋值方式对字符指针变量赋值char*a=IloveChina!;等价于char*a;a=IloveChina!;但注意赋给a的不是字符,而是字符串的首地址。而对数组的初始化:charstr[14]={IloveChina!};不能等价于charstr[14];str=IloveChina!;应为:strcpy(str,IloveChina!);2020/3/322charstr[10];scanf(%s,str);是可以的而char*p;scanf(%s,p);是危险的。应当这样:char*p,str[10];p=str;scanf(%s,p);先使p指向一个字符数组,把输入的字符串存放在以该地址开始的数组中。(2)输入方式2020/3/323(3)指针变量的值是可以改变的char*p=IloveChina!;p=p+7;printf(%s,p);运行结果如下:China!输出字符串时从p当时所指向的单元开始输出各个字符,直到遇'\0'为止。而数组名的值是不能改变的。下面是错误的:charstr[]={IloveChina!};str=str+7;printf(%s,str);(3)字符指针是变量,而字符数组名是常量2020/3/324可以用下标形式引用字符串中的字符。如:intmain(){char*p=IloveChina!;inti;printf(Thesixthcharacteris%c\n,p[5]);printf(“%s\n”,p);}2020/3/325(4)指针指向格式字符串char*format=a=%d,b=%d\n;printf(format,a,b);相当于printf(a=%d,b=%d\n,a,b);实际上字符串常量就是一个指针,是指向存储该字符串的无名字符数组的指针。2020/3/326也可以用字符数组实现。如:charformat[]=a=%d,b=%d\n;printf(format,a,b);但由于不能采用赋值语句对数组整体赋值,如:charformat[];format=a=%d,b=%d\n;因此用指针变量表示字符串的方式更为方便。2020/3/3272020/3/3282020/3/3292020/3/330这一节我们学到了字符串常量C语言中字符串的表示方式字符数组字符指针constchar*p=Hello;字符指针作函数参数字符指针和字符数组的比较
本文标题:C语言-ch08-4-通过指针引用字符串
链接地址:https://www.777doc.com/doc-4128235 .html