获取数组变量的地址是什么意思?

Whatacold

今天,我读了一个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:阅读答案后,我意识到这两个表达式主要使我感到困惑:

  1. &a + 1,已在Stack Overflow上被问到:关于c中的表达式“&anArray”

  2. *(&a + 1) -1,这与阵列衰减有关。

伊恩·雅培(Ian Abbott)

让我们对其进行剖析。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章