C笔试题: *(((char *)(&a + 1)) - 3) - 2 --->a ,&a[0] 和 &a 之间的关系

char a[5] = {10,20,31,32,40};

*(((char *)(&a + 1)) - 3) - 2

输出多少?

根据运算符优先级,可以将表达式拆分为以下几个部分:

  1. &a:取数组 a 的地址,得到 char (*)[5] 类型的指针;
  2. &a + 1:指针加法,将指针向后移动 1 * sizeof(char (*)[5]) 个字节,得到 char (*)[5] 类型的指针,指向数组 a 的下一个位置;
  3. (char *)(&a + 1):将指向下一个位置的指针强制转换为 char * 类型的指针;
  4. ((char *)(&a + 1)) - 3:指针减法,将指针向前移动 3 * sizeof(char) 个字节,得到 char * 类型的指针,指向数组 a 的第三个元素;
  5. *(((char *)(&a + 1)) - 3):解引用,得到数组 a 的第三个元素的值 31
  6. *(((char *)(&a + 1)) - 3) - 2:整数减法,将 31 减去 2,得到 29

因此,表达式的值为 29

&a,表示int[5]整个大单元的大小

&a+1,偏移20bytes大小

a+1,偏移4bytes大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值