今天,我读了一个C代码片段,这确实让我感到困惑:
#include <stdio.h>
int
main(void)
{
int a[] = {0, 1, 2, 3};
printf("%d\n", *(*(&a + 1) - 1));
return 0;
}
在我看来,&a + 1
这没有任何意义,但它运行时没有错误。
这是什么意思?并执行K&R C圣经覆盖呢?
更新0:阅读答案后,我意识到这两个表达式主要使我感到困惑:
&a + 1
,已在Stack Overflow上被问到:关于c中的表达式“&anArray”
*(&a + 1) -1
,这与阵列衰减有关。
让我们对其进行剖析。
a
具有类型int [4]
(4 int数组)。它的大小为4 * sizeof(int)
。
&a
具有类型int (*)[4]
(指向4个int数组的指针)。
(&a + 1)
也有类型int (*)[4]
。它指向一个由4个int组成的数组,该数组从开始处的1 * sizeof(a)
个4 * sizeof(int)
字节开始a
。
*(&a + 1)
是类型int [4]
(4个int的数组)。它的存储起始1 * sizeof(a)
字节(或4 * sizeof(int)
起始后的字节)a
。
*(&a + 1) - 1
类型为int *
(指向int的指针),因为数组*(&a + 1)
会衰减为指向此表达式中第一个元素的指针。它将指向一个int,该int在。开始1 * sizeof(int)
之前开始字节*(&a + 1)
。该指针值与相同&a[3]
。
*(*(&a + 1) - 1)
是类型的int
。因为*(&a + 1) - 1
是和相同的指针值&a[3]
,*(*(&a + 1) - 1)
等于a[3]
已初始化为的指针值3
,所以这是指针打印的数字printf
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句