五行代码的疑惑.doc_第1页
五行代码的疑惑.doc_第2页
五行代码的疑惑.doc_第3页
五行代码的疑惑.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

五行代码的疑惑(关于指针的深刻理解.)2007/08/12议题作者:sudami信息来源:黑客基地()文章内容:有人曾问过我一道C语言的题目,如下 #include void po(char *pt) pt+=3; void main() char *pt,str=aceg; pt=str; po(pt); cout*pt; 除掉函数头和花括号之后就只有五行,这个关于指针操作的程序看似简单,我想大部分人看到这个题目,都会毫不犹豫的说输出g,不知道计算机前的你会怎样认为。我曾拿她问过几位比较有经验的程序员,他们也是这样认为。 我先不想对结果发表看法,只想问一下你怎样看传值调用与传址调用。很显然这个题目是关于传址的,也正是因为这点,才会有人这么肯定g的答案。如果你仔细想一想的话,你又怎么认为呢?该怎样改才算正确呢?有几种改法呢?你又联想到了哪些呢?-正确结果:那么我来分析下:void po(char *pt) pt+=3; 参数是一个指针,这个指针本身是一个局部变量(分配在栈上),它得到的值是外部代码传给它的一个副本值,而不是副本来源变量本身的地址。所以当它的值变化时,外界的那个指针的值是不会变化的。将指针值pt作为值进栈,op里虽然改变了,出栈依旧是原值.po那个函数没有真正改变指针pt的位置。所以,看到的,还是字符串的第一个字母a.通常有两种改法:void po(char *pt) / C写法 (就是用个二级指针来存放main里pt的地址!这样改变po里的pt就会改变main里pt的指向了)或者void po(char * &pt) / C+写法一句话:子函数需要改变父函数的某个值 需要给子函数传递指针进一步深刻的分析,看下面3个例子:#include int po(char *pt) *pt=*pt+3;return(*pt); void main() char *pt,str=aceg; pt=str; po(pt); cout*pt; 结果是d!因为PO在得到了pt指针所指向的str的0地址后,是把str0的值 +3后返回的,就是a+3,这是ASC值在增加,结果当然是d.#include int po(char *pt) *pt=*(pt+3);return(*pt); void main() char *pt,str=aceg; pt=str; po(pt); cout*pt; 结果是g !因为PO在得到了pt指针所指向的str的0地址后,是把这个0指针 +3后返回的,就是str0+3=str3,结果当然是g.#include int po(char *pt) pt=pt+3; /* 看清楚了,这里的pt只是函数po的局部变量,它和主函数中的那个pt是完全不同的,也就是他在这里对主函数中的操作没有任何作用,因为它不会返回到主函数中执行*/return(*pt); void main() char *pt,str=aceg; pt=str; po(pt); cout*pt; 结果是a!这个要非常注意!其实从变量的作用域的角度可以这样解释:在main函数中定义的指针变量pt的作用域只局限于main函数内,而po函数中的形参指针变量pt的作用域也只在po函数内。因此在main函数中”cout*pt;中的pt是main函数中的pt。所以输出结果还是“abcd”.在main里,指针变量pt是存着str的首地址的,传给po时也是传str的首地址过去po里的pt!但两个pt都只是在各自的函数里的变量(局部变量)!po里的pt影响不了main里的pt如果你把输出语句方到po函数体内的话,则是po函数中的pt了.如下:#include int po(char *pt) pt=pt+3; /* 看清楚了,这里的pt只是函数po的局部变量,它和主函数中的那个pt是完全不同的,也就是他在这里对主函数中的操作没有任何作用,因为它不会返回到主函数中执行*/cout*ptendl; /这是多加的一行,在这里,输出的结果就是str3所指向的greturn(*pt); void main() char *pt,str=aceg; pt=str; po(pt); cout*pt; 结果是gaC程序设计(谭浩强 著)有这样一段话:在C语言中实参变量和形

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论