



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
请问一下大家,字符数组与字符指针变量用法有什么区别?另外char *s 与 char s有什么区别?最佳答案 字符数组名与字符串指针变量名的区别2009-01-19 19:08授课内容:一、字符串指针变量的说明和使用字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p=&c;表示p是一个指向字符变量c的指针变量。而: char *s=C Language;则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。请看下面一例。main()char *ps;ps=C Language;printf(%s,ps);运行结果为:C Language上例中,首先定义ps是一个字符指针变量, 然后把字符串的首地址赋予ps(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入ps。程序中的: char *ps;ps=C Language;等效于: char *ps=C Language;输出字符串中n个字符后的所有字符。二、字符指针变量的运算main()char *ps=this is a book;int n=10;ps=ps+n;printf(%sn,ps);运行结果为:book在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为book。main()char st20,*ps;int i;printf(input a string:n);ps=st;scanf(%s,ps);for(i=0;psi!=0;i+)if(psi=k)printf(there is a k in the stringn);break;if(psi=0) printf(There is no k in the stringn);本例是在输入的字符串中查找有无k字符。三、字符串指针作为函数参数的使用。要求把一个 字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。表达式: (*pds=*pss)!=0cpystr(char *pss,char *pds)while(*pds=*pss)!=0)pds+;pss+; main()char *pa=CHINA,b10,*pb;pb=b;cpystr(pa,pb);printf(string a=%snstring b=%sn,pa,pb);在上例中,程序完成了两项工作:一是把pss指向的源字符复制到pds所指向的目标字符中,二是判断所复制的字符是否为0,若是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。四、使用字符串指针变量与字符数组的区别用字符数组和字符指针变量都可实现字符串的存储和运算。 但两者是有区别的。在使用时应注意以下几个问题:1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以0作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。2. 对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st=“C Language”;而对字符串指针变量则无此限制,如: char *ps=C Language;3. 对字符串指针方式 char *ps=C Language;可以写为: char *ps;ps=C Language; 而对数组方式: static char st=C Language;不能写为: char st20; st=C Language;而只能对字符数组的各元素逐个赋值。从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。前面说过,当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。因此, char *ps=C Langage;或者 char *ps; ps=C Language;都是合法的。你这个问题问得很好,我们知道实际上一个字符串在进行赋值的时候,例如: char *p=hello world;这样赋值是允许的。那么这并不代表hello world这个就是一个指针,实际上我们的这一动作,编译器在幕后为我们做了很多事,首先在常量区分配一个字符数组,然后将hello world这个字符串中的字符(包括最后的0字符。)拷贝到此数组(其实此数组我们可以看成是一个匿名数组,因为没有数组名)。然后返回数组首元素的地址,将此地址赋值给字符指针变量p。我们知道在c语言中没有字符串这种类型,在c语言中的字符串是通过字符数组来实现的,而且必须要求此字符数组具有0结束符。这就是字符串与一般的字符数组不同的地方。话说回来,你问到为什么char *p=hello world; coutpendl;打印出来的是字符串,而不是地址。其实当初我也想到过类似的问题,没有找到权威的答案,但是我能够猜出几分。C+语言是兼容C语言的,所以在输出C串的时候是直接以给出的首地址,输出,直到遇到结束符0结束。为什么会这样呢,我想着应该是语言的特性,或者是编译器的特性。既然C语言中字符串是通过带0的字符数组实现的,那么请问如果编译器是由你来实现的,或者是printf()函数是你写的,要输出一个字符串的话你会怎么样呢,你是不是会输出指针的地址呢,coutpendl;这样的形式让读者一目了然,我要输出的就是一个字符串,而实际上p就是一个字符指针变量而已,为什么输出字符串,这在于cout的实现了,cout的实现我不的而知,但是可以肯定的是cout确实在遇到字符指针的时候会将做出这样的行为:将此指针当做首地址,向下输出字符,直到遇到0结束为止。 这就是cout的行为,没有为什么。 其实你自己可以写一个自己的cout函数,输出地址而不是按照cout的默认行为。当然要实现cout的功能,必须要了解很多底层知识。 我们可以通过这样的方式输出字符指针的值,而不是输出以其为首地址的字符串。例如char a=A; char *p=&a; cou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年初二生物会考试题及答案
- 2025年新闻评论写作试题及答案
- 安康市中石油2025秋招笔试行测50题速记
- 国家能源锦州市2025秋招采矿工程类面试追问及参考回答
- 临汾市中石化2025秋招笔试模拟题含答案法律与合规岗
- 合肥市中石油2025秋招笔试提升练习题含答案
- 嘉兴市中石化2025秋招面试半结构化模拟题及答案电气仪控技术岗
- 衡水市中石化2025秋招面试半结构化模拟题及答案安全环保与HSE岗
- 金华市中石化2025秋招面试半结构化模拟题及答案安全环保与HSE岗
- 中国广电钦州市2025秋招行业解决方案岗位专业追问清单及参考回答
- 烈士陵园介绍课件
- 通信行业安全生产责任清单制全员安全职责
- CGF生长因子在口腔医学中的应用
- 渣土运输日常管理制度
- 【课件】列代数式表示数量关系(第3课时+反比例关系)+课件+2024-2025学年人教版七年级数学上册+-
- JG/T 225-2007预应力混凝土用金属波纹管
- 贴牌委托协议书
- 百万英镑课件
- 村级安全生产培训课件
- 透析导管患者的护理查房
- 胎盘早剥护理常规
评论
0/150
提交评论