【发布时间】:2013-08-24 01:01:14
【问题描述】:
我有以下 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 的内存位置的地址?那为什么这些值相等呢?
【问题讨论】:
-
&a[0]和&a[0][0]不相同。 -
你应该使用
%p来打印指针,并转换为void *。 -
[为什么 A[0]、&A 和 *A 输出的值相同](stackoverflow.com/q/17623556/2455888) 的可能重复项。
-
@hacks: 但是为什么我在打印它们时会得到相同的值呢?
-
@Pulkit Yadav:当你问一个关于以这种方式而不是以其他方式工作的问题时,你必须解释为什么你觉得它很奇怪。你的输出中没有什么出乎意料的,所以你的问题看起来真的像“为什么 2+2 是 4”。你希望人们如何回答这样的问题?说明您对该输出有哪些具体问题,更重要的是,说明您为何将它们视为“问题”,我们会解决这些问题。
标签: c arrays pointers multidimensional-array