【发布时间】:2013-03-31 07:20:24
【问题描述】:
来自以下代码的问题:
#include <stdio.h>
int main(int argc,char *arg[]){
if (argc>2){
int m=atoi(arg[1]);
int n=atoi(arg[2]);
int a[m][n];
int (*p)[m][n]=&a;
printf("p : %p, *p : %p, **p : %p\n",p,*p,**p);
}
return 0;
}
主环境:gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) x86-64
gcc main.c
./a.out 2 4
输出:
p : 0xbfea7ef0, *p : 0xbfea7ef0, **p : 0xbfea7ef0
问题是为什么p == *p == **p。我认为这可能是因为a 是一个数组,是一种特定地址的常量指针,这涉及到 gcc 的一些实现细节。
【问题讨论】:
-
否;这不是 GCC 的怪癖;这是预期和要求的行为。不过,解释它比仅仅陈述更难!
-
尝试描绘通过组织范式访问的内存块,该组织范式由您使用的类型化语言决定。现在,转到该块的开头;三次。是的。它仍然与之前的时间(和之前的时间)相同。如果它有帮助,请考虑
a数组在内存中的位置。现在是&a、&a[0]和&a[0][0]。你认为其中任何一个会不同吗? -
C 中的数组很奇怪。这是最简单的解释。
-
是的@WhozCraig,在gcc下&a和a的值是一样的。
标签: c arrays pointers dereference