搜索
查看: 511|回复: 1

[分享] 带来一个不错的C语言试题

[复制链接]

该用户从未签到

2586

主题

2613

帖子

0

蝴蝶豆

版主

最后登录
2021-3-16
发表于 2020-7-6 13:11:17 | 显示全部楼层 |阅读模式
各位,今儿给大家带来一个不错的C语言试题,此题对你在C中的数组理解与掌握是个不错的检查,话不多说,请看题:

微信图片_20200706131047.jpg

问题是会输出什么?

我们就开门见山了,通过阅读代码发现本体主要考察以下四方面:数组的指针法访问;数组名和数组名取地址的应用与区别;sizeof关于数组名和其他变量的用法;强制类型转换。

解析之前我们有两点需要明确:
1、在C中,几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。它的类型取决于数组元素的类型:如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》

2、在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。sizeof返回整个数组的长度,而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。——《C和指针》。

本体解析:
1、&a表示的是整个数组的地址,+1后表示移动跟这个数组大小一样的空间,int*进行了强制类型转换为一个int类型元素的地址,因此p指向了数组a后面的一个int类型元素。

2、*(p-1)表示p向后移动一个int类型的字节数再解引用,因此为数组a的最后一个元素5;*p-1表示先解引用p指向的地址出的值在减一,此时该值是未定义的。

3、sizeof(数组名)得到的是整个数组的字节数,即5*4=20;sizeof(数组地址)为地址多占字节数,64位下为8。

4、本题答案为5,未定义,20,8。

好了,就讲到这里吧,你明白了吗?感谢耐心阅读!

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-15 11:47
  • 签到天数: 537 天

    [LV.9]

    29

    主题

    2176

    帖子

    127

    蝴蝶豆

    论坛元老

    最后登录
    2024-4-24
    发表于 2020-7-7 11:44:51 | 显示全部楼层
    int的字节数,和指针的大小,应该和平台相关吧?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-27 06:47 , Processed in 0.162634 second(s), 33 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表