指针面试题解读.docx

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
有关C/C++指针的经典面试题?(2010-06-06 00:26:50)转载▼标签:?杂谈分类:?C/C++C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的解析一下指针的有关笔试,面试题.所有题目来源网络,分析是我写的...0.预备知识,最基础的指针其实最基础的指针也就应该如下面代码:int a;int* p=a;也就是说,声明了一个int变量a,然后声明一个int的指针,*p指向a的地址,也就是取地址符号,而*是指针中取内容的符号,仅仅在声明的时候标记这个变量是指针.可能有点绕口,但是看代码来的容易的多...?1.与const在一起的时候常常声明的时候会让人一头雾水,比如下面的声明,均是声明一个char* p的指针:char * const p;????// 指针不可改,也就说指针只能指向一个地址,不能更改为其他地址char const * p;???// 所指内容不可改,也就是说*p是常量字符串char const * const p; // 内容和指针都不能改const char * const p; // 同上...内容和指针不能改额...别晕,别晕....其实方法很简单...你别真死记硬背...其实可以以*为分界符,在*左边有const就说明内容不能改,在*右边就说明指针不能改,而左边的char和const顺序是不要紧的...呵呵...你也可以理解成const是修饰后面的,正常顺序应该这样:const char * const p; 是不是看起来简单了??2.忽悠人的陷阱,str[]和*str的区别先告诉你哦,下面的题目可是陷阱啊....说说程序结果...char str1[] = “abc”;char str2[] = “abc”;const char str3[] = “abc”;const char str4[] = “abc”;const char *str5 = “abc”;const char *str6 = “abc”;char *str7 = “abc”;char *str8 = “abc”;cout ( str1 == str2 ) endl;cout ( str3 == str4 ) endl;cout ( str5 == str6 ) endl;cout ( str7 == str8 ) endl;怎么样?都输出true?那显然你中标了...而且cout输出bool值的时候,就算全是真也应该都输出1啊...4个1?那也不对...答案是0011,不信你试试...为什么呢?其实都说了这题是个大陷阱,因为这题根本不是比较字符串内容!而是比较字符串的地址.哦...恍然大悟...那为什么前两个是假呢?因为这可是说是一个深拷贝/浅拷贝的问题.当字符串是数组形式声明并初始化,编译器认为是新数组,分配新空间,但不是深拷贝,因为根本就不算拷贝.而如果是相同的字符串,用指针声明,那就是比较如果有一样的字符串,就直接把新指针指过去,这是正宗的浅拷贝.哇哈...你就中计了...?3.str[]用sizeof判断会出错么?应该说我们常常用指针有很多时候是解决字符串的问题,一般我们用strlen,这当然没有问题,但是要你编一个呢?看看下面这个MyStrlen有问题么?intMyStrlen(char str[]){????return (int)(sizeof(str)-1);}呵呵...咱们上当过一次..这个当然也是不对的...不错...这个函数是错的...为什么呢?首先,可以告诉你,无论何时,返回的总是3...额...是不是很奇怪,为什么不是数组长度呢?str不是char数组指针么?不错...确实是数组的指针,但是,当用函数传递的数组指针的时候就自动退化为指针了,而指针的长度是4,你减去1了自然就是3了.但是如果按照下面代码就可以得到正常的值.charstr[]=hello world;intlen=sizeof(str)-1;???//记得减1哦,最后有\0结尾coutlen;这样输出的是正常值,也就是你所希望的11;?4.注意数组指针和指针继续上面的话题,刚刚提到了数组指针和指针,现在看看下面这端程序代码:int a[5]={1,2,3,4,5};int *ptr=(int *)(a+1);cout*(a+1)*(ptr-1);呵呵...BaihowFF总是给陷阱..肯定不是想当然的说就是21...确实...答案是25...额...奇怪吧..为什么呢?首先,a是一个数组,所以编译器解释a就是a的全部长度,就是说(a+1)也就是说移动了一个数组,指向了并不存在的a[5],

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档