【发布时间】:2021-07-26 21:12:36
【问题描述】:
这个 Q in C, how come the address of array, &array, &array[0] are the same? 让我研究了指针和数组:我确认它们非常相似但不完全相同。
&a[0] 是a 或&a 的详细形式。但是& vs [] 的优先级呢?
当我像(&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) 得到了相同的结果。似乎不能漏掉一块。突然&a确实匿名创建了一个指针。
使用索引 0,您可以通过 a 及其指针 b 获得基址 (...c9c)。但是对于索引 1,会发生一些奇怪的事情,而 b 则不同。
这有规则吗?我什至不知道我想不想听!除了介于a 和&a[0] 之间之外,这就是&a 的作用吗?
chux 的好 A。他的演员阵容更简单,但也一样吗?
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) 生成一个新类型,但不是指针?对同一地点的新参考。 = 指向 = 数组的指针的地址。
【问题讨论】:
-
通过C operator precedence,您可以很快确定它将做什么:首先我们使用下标,然后使用地址运算符(不存在括号)。上面代码的窍门是数组的地址和第一个元素的地址相同(
a[0]),所以&a[0] == &(*a)。另一个技巧是数组“衰减”成指针。a是一个数组类型,但&a(或&any_variable)将是变量的地址,它本质上是一个指针。