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

带来一个不错的C语言试题

[复制链接]
gaosmile 发布时间:2020-7-6 13:11
各位,今儿给大家带来一个不错的C语言试题,此题对你在C中的数组理解与掌握是个不错的检查,话不多说,请看题:
9 v( W9 x2 ?  e3 ~% F9 w5 }. a
微信图片_20200706131047.jpg

" T( B  y& R8 c' X( ?5 }
问题是会输出什么?
# z9 l6 c  q+ n) U0 R
我们就开门见山了,通过阅读代码发现本体主要考察以下四方面:数组的指针法访问;数组名和数组名取地址的应用与区别;sizeof关于数组名和其他变量的用法;强制类型转换。
; L# \2 v6 z' J
解析之前我们有两点需要明确:
1、在C中,几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。它的类型取决于数组元素的类型:如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》
8 Y* l& P' U+ h2 N9 x& S% P
2、在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。sizeof返回整个数组的长度,而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。——《C和指针》。
% q) O: S/ p) }, x8 s* o4 C6 g
本体解析:
1、&a表示的是整个数组的地址,+1后表示移动跟这个数组大小一样的空间,int*进行了强制类型转换为一个int类型元素的地址,因此p指向了数组a后面的一个int类型元素。
. |; @9 ?) Z" `( m  x% q! ^
2、*(p-1)表示p向后移动一个int类型的字节数再解引用,因此为数组a的最后一个元素5;*p-1表示先解引用p指向的地址出的值在减一,此时该值是未定义的。
3 i0 u: G$ l8 A/ V% v( l3 D& n
3、sizeof(数组名)得到的是整个数组的字节数,即5*4=20;sizeof(数组地址)为地址多占字节数,64位下为8。

% V6 i4 U+ L, W* X% h' b3 f5 l
4、本题答案为5,未定义,20,8。
. u' `/ e2 r# i+ V  d
好了,就讲到这里吧,你明白了吗?感谢耐心阅读!
7 ^2 P1 K% v8 I- F# ]) o
赞 收藏 评论1 发布时间:2020-7-6 13:11

举报

1个回答
STM1024 回答时间:2020-7-7 11:44:51
int的字节数,和指针的大小,应该和平台相关吧?
. t2 _# z1 M+ L( S
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版