我有以下 C 程序:
#include <stdio.h>
int main(){
int a[2][2] = {1, 2, 3, 4};
printf("a:%p, &a:%p, *a:%p \n", a, &a, *a);
printf("a[0]:%p, &a[0]:%p \n", a[0], &a[0]);
printf("&a[0][0]:%p \n", &a[0][0]);
return 0;
}
它提供以下输出:
a:0028FEAC, &a:0028FEAC, *a:0028FEAC
a[0]:0028FEAC, &a[0]:0028FEAC
&a[0][0]:0028FEAC
我无法理解为什么&a
, a
, *a
- 都相同。,a[0]
和&a[0]
也是如此&a[0][0]
。
编辑:
多亏了这些答案,我才理解了这些值相等的原因。Kernighan & Ritchie书中的这句话原来是我问题的关键:
the name of an array is a synonym for the location of the initial element.
所以,由此,我们得到
a
= &a[0]
, 和
a[0]
= &a[0][0]
(考虑a
为数组数组)
直觉上,现在输出背后的原因很清楚了。但是,考虑到指针是如何在 C 中实现的,我无法理解它们是如何a
相等&a
的。我假设a
内存中有一个指向数组的变量(并且此数组内存块的起始地址将是此变量的值a
)。
但是,当我们这样做时&a
,这是否意味着获取存储变量的内存位置的地址a
?为什么这些值相等呢?