gpt4 book ai didi

arrays - (&array)[1] 到底是什么?

转载 作者:行者123 更新时间:2023-12-03 08:22:41 25 4
gpt4 key购买 nike

这个问题in C, how come the address of array, &array, &array[0] are the same?让我研究指针和数组:我确认它们非常相似但不相同。

&a[0]a&a 的详细形式。但是 &[] 的优先级又如何呢?

当我以错误的方式放置括号时,例如 (&a)[1],这改变了值,但 (&a)[0] 没有改变。

#include <stdio.h>


int main(){
int a[3] = {10,20,30};

int *b;
b = a;

printf("%p a\n", a);
printf("%p a+1\n", a+1);
printf("%p a+2\n\n", a+2);

printf("%p (&a)[0]\n", (&a)[0]);
printf("%p (&a)[1]\n", (&a)[1]);
printf("%p (&b)[0]\n", (&b)[0]);
printf("%p (&b)[1]\n\n",(&b)[1]);
printf("%p cast\n\n", (void **)((&a) + 1) );
int *c = a;
printf("%p\n", c);
printf("%p\n", &c);
return 0;
}

输出:

0x7ffe18053c9c a
0x7ffe18053ca0 a+1
0x7ffe18053ca4 a+2

0x7ffe18053c9c (&a)[0]
0x7ffe18053ca8 (&a)[1]
0x7ffe18053c9c (&b)[0]
(nil) (&b)[1]

0x7ffe18053ca8 cast

0x7ffe18053c9c c (int *c = a)
0x7ffe18053c90 &c

我发现 (void **)((&a) + 1) 得到了相同的结果。看来是不能漏掉一 block 了。突然&a确实匿名创建了一个指针。

使用索引零,您可以通过a 及其指针b 获得基地址(...c9c)。但是索引为 1 时会发生奇怪的事情,并且 b 的情况有所不同。

这有什么规则吗?我什至不知道我是否想听!除了位于 a&a[0] 之间之外,这就是 &a 的作用吗?


这里是 chux 的好 A。他的 Actor 阵容更简单,但效果一样吗?

difference between &array and &array[0] in C


从提到的链接中,我不仅简化了我的转换,而且现在我想我知道它的作用以及为什么 0 的索引或偏移量是特殊的。

(void *)(&a + 0) 是强制转换。但为什么还要投呢? &a + 0 打印基地址。使用偏移量 + 1 时,地址会前进整个数组大小(不是我尝试的指针)-“超出末尾”。第二维度。基数保留,但偏移量发生变化。

对于作业:

int *c = a;
int (*d)[3] = &a; // with some help from the left...
int *e = (int *)&a; // ... or on the right side...
int *f = &a; // or with a warning, but working

那么 (&a) 会生成一个新类型,而不是指针?对同一地点的新引用。 = 指向 = 数组的指针的地址。

最佳答案

TL;博士:

  • &a[0] 返回数组a第一个元素的地址。由于 C 中的数组几乎总是自动衰减(转换)为指向其第一个元素的指针,因此通过查看 a&a[0],您将观察到相同的行为>。但请注意,在某些情况下这种转换不会发生,最明显的一种是在数组上使用 sizeof 运算符。

  • (&a)[0] 获取数组的地址,然后将结果视为数组并尝试访问它的第一个元素。这与仅取消引用结果指针相同,因此 (&a)[0]*(&a) 相同,与 a< 相同。比见上面。

  • (&a)[1] 几乎与之前类似,但它尝试访问由指向数组的指针构造的假设数组的第二个元素一个。由于这实际上不是一个数组,并且没有第二个元素,因此该代码格式不正确,并会触发未定义行为

关于arrays - (&array)[1] 到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67386186/

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