你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一道鹅厂C语言面试题

[复制链接]
gaosmile 发布时间:2020-7-1 13:08
鹅厂面试题
) E' y* U1 u: R( |8 ]
今天小编给大家带来一道鹅厂面试题。请阅读下面三行代码,思考输出是什么,为什么呢?

  1. ' b& z, X3 I2 o
  2. #include<stdio.h>
    4 B' g: E! a& x* Z2 O( ]
  3. int main()* M' R' t/ O  p. v
  4. {, ]4 `" l3 T$ v1 Z, ^2 X2 ?
  5.   int a[5]={1,2,3,4,5};5 y+ J6 x( |$ E) |
  6.   int *ptr=(int*)(&a+1);
    5 w4 j6 y; o& \% T
  7.   printf("%d,%d",*(a+1),*(ptr-1));
    3 V( k$ b% |: `: j+ }. e, q
  8.   return 0;+ N- L2 u2 g! a$ |; [; i
  9. }<font style="background-color:rgb(255, 255, 255)">) F0 e9 l7 c, D& o6 h0 Q/ _* {  y
  10. </font>
复制代码
' f4 z! E) ~8 D6 ?

答案
! Y, F! H/ W5 P. J5 A# U, l

输出结果: 2 , 5   ( 你答对了吗? )
(a+1) 就是 a[1] ,  *(ptr-1) 就是 a[4] ,因此执行结果为 2 , 5。
&a+1 不是数组首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例中为5个int)。
int *ptr = (int *)(&a+1) ,则ptr实际是&(a[5]),即a+5。ptr-1 就是 a+4 。  o5 r) M* m9 Y$ V# n5 ^

5 V; \9 @# G8 X, \

解析
& |) q5 x4 b- q

&a是数组指针,也就是指针的指针,一个二级指针,其类型为 int(*)[5] 。
而指针加 1 要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
a是长度为5的int型指针,&a+1 加的是 5*sizeof(int),所以ptr实际是a+5。
但是ptr的类型是int* ,而(&a+1)的类型是 int(*)[5],二者类型并不相同(这点很重要)。因此 ptr-1 只会减去 sizeof(int)。

$ r/ K4 j" Q7 T+ i3 X- y! G
a,&a的地址是一样的,但是代表的意思不相同。
' I4 n) h  v) X" _* S  S4 f/ A) b
a是数组的首地址,也就是a[0]的首地址。a+1 是数组下一元素的地址,即a[1]。
&a是对象(数组)的首地址,&a+1是下一个对象的地址,即a[5]。
赞 收藏 评论0 发布时间:2020-7-1 13:08

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版