注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识58——两个小面试题的分析  

2015-01-23 15:56:41|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C++小知识58——两个小面试题的分析

昨天同事问了两个小面试题,都答错了。呵呵,水平不行啊。知错咱就改。先看题:
     第一个:
                float ft = 32.07;
       int it = (int &)ft;
              第二个: 
int  a[5] = { 1, 2, 3, 4, 5 };
int  *ptr = (int *)(&a + 1);
printf("%d %d", *(a + 1), *(ptr - 1));
int *a1 = ptr - 1;

第一个问题,主要是没看到过,凭经验认为是一个引用,其实不是,他相当于*((int*)&a),在机器上调试后发现确实如此。
第二个问题,想当然的当成了二维数组中行列的头的指针的变化。确实是指针的头的变化,但这里考的是,指针前进大小。大家都知道,什么类型的指针其加一或者减一,都会前进或者后退其类型长
度的大小的步长。如果是对象的话,会前进或者后退对象的长度大小的步长。举个例子,如果是int*ptr;ptr+=1;那ptr实际上是前进了四他字节。如果把int改成short就是两个字节。数组是定长的,
所以如果把数组的头取指针,那么就认为这整个数组的长度是一个对象类型,其加一,就相当于前进整个数组的步长。
所以说,如果是数组的名(&a)取地址再转回去就是整个数组长度(int*array-len)为步长,如果直接用数组名(a),就是加数组内部数组类型(int)一个的长度的步长.
功夫在细节。
  评论这张
 
阅读(322)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017