gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:24:18 26 4
gpt4 key购买 nike

今天我读了一段让我很困惑的 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 bible覆盖这个?

更新 0:看完答案,我发现这两个表达方式主要让我感到困惑:

  1. &a + 1,已在 Stack Overflow 上被问及:about the expression “&anArray” in c

  2. *(&a + 1) -1,与数组衰减有关。

最佳答案

首先提醒一下(如果您以前不知道,则提醒一下):对于任何数组或指针 p和索引i表达式 p[i]*(p + i) 完全相同.

现在希望能帮助您了解正在发生的事情...

数组a在您的程序中存储在内存中的某个位置,具体位置并不重要。获取where a的位置被存储,即获得指向 a 的指针,您使用寻址运算符 &喜欢&a .此处要了解的重要一点是指针本身并不意味着任何特殊的东西,重要的是指针的基类型a 的类型是int[4] ,即 a是四个 int 的数组元素。表达式的类型 &a是指向四个 int 的数组的指针, 或 int (*)[4] .括号很重要,因为类型 int *[4]是指向 int 的四个指针的数组,这是完全不同的事情。

现在回到初始点,即p[i]*(p + i)相同.而不是 p我们有&a , 所以我们的表达式 *(&a + 1)(&a)[1]相同.

现在解释了什么 *(&a + 1)意思和它的作用。现在让我们考虑一下数组 a 的内存布局。 .在内存中它看起来像

+---+---+---+---+| 0 | 1 | 2 | 3 |+---+---+---+---+^|&a

表达式(&a)[1]对待 &a因为它是一个数组数组,它​​肯定不是,并且访问这个数组中的第二个元素,这将超出范围。这当然在技术上是未定义的行为。不过,让我们用它运行一下,并考虑一下在内存中的样子:

+---+---+---+---+---+---+---+---+| 0 | 1 | 2 | 3 | . | . | . | . |+---+---+---+---+---+---+---+---+^               ^|               |(&a)[0]         (&a)[1]

现在记住 a 的类型(与 (&a)[0] 相同,因此意味着 (&a)[1] 也必须是这种类型)是 四个 int 的数组。由于数组自然衰减为指向其第一个元素的指针,因此表达式 (&a)[1]&(&a)[1][0]相同,它的类型是指向 int指针。所以当我们使用 (&a)[1]在表达式中,编译器给我们的是指向 &a 的第二个(不存在的)数组中的第一个元素的指针。 .我们再次来到 p[i]等于 *(p + i)等式:(&a)[1]是指向 int指针,它是 p*(p + i)表达式,所以完整的表达式是 *((&a)[1] - 1) ,并查看上面的内存布局减去一个 int来自 (&a)[1] 给出的指针给我们 (&a)[1] 之前的元素这是 (&a)[0] 中的最后一个元素,即它给了我们 (&a)[0][3]a[3] 相同.

所以表达式 *(*(&a + 1) - 1)a[3]相同.

这是冗长的,并且通过了危险的领域(越界索引),但是由于指针算法的强大功能,它最终都解决了。不过,我不建议您编写这样的代码,它需要人们真正了解这些转换的工作原理才能破译它。

关于c - 获取数组变量的地址是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38202077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com