char a[5] = {10,20,31,32,40};
*(((char *)(&a + 1)) - 3) - 2
输出多少?
根据运算符优先级,可以将表达式拆分为以下几个部分:
&a
:取数组a
的地址,得到char (*)[5]
类型的指针;&a + 1
:指针加法,将指针向后移动1 * sizeof(char (*)[5])
个字节,得到char (*)[5]
类型的指针,指向数组a
的下一个位置;(char *)(&a + 1)
:将指向下一个位置的指针强制转换为char *
类型的指针;((char *)(&a + 1)) - 3
:指针减法,将指针向前移动3 * sizeof(char)
个字节,得到char *
类型的指针,指向数组a
的第三个元素;*(((char *)(&a + 1)) - 3)
:解引用,得到数组a
的第三个元素的值31
;*(((char *)(&a + 1)) - 3) - 2
:整数减法,将31
减去2
,得到29
。
因此,表达式的值为 29
。
&a,表示int[5]整个大单元的大小
&a+1,偏移20bytes大小
a+1,偏移4bytes大小