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大小

猜你喜欢

转载自blog.csdn.net/qq_23172985/article/details/130213304