c语言二维数组

auto int a[8][8];
为什么 &a[2]= &a[2][0];
我只能理解a[2]= &a[2][0];

1、首先是定义一个二级指针和行列变量【int **array,row,column;】。

2、然后编写输入行列的语句,代码如图。

3、接下来就可以为其开辟一个一个一维装着一维数组的数组。

4、接下来使用【array[i]=(int *)malloc(sizeof(int)*column);】,为数组再次产生一个新的装着数组的数组。

5、然后就可以为其赋值并输出【代码如图】,就完成了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
auto int a[8][8];
那么a[2]就相当于一个一维数组名,那么a[2]的数值等于&a[2][0]是没什么疑问的
数组名本身代表数组的首地址,那&a[2]是怎么回事呢,早期的c编译器会认为这是非法的,但是从语义上讲,对一个数组对象取地址没什么不合理的,于是C99开始允许对数组名取地址,相当于把该数组维数提升了1级,在这个例子里a[2]的类型是int*, &a[2]的类型是int(*)[8];,就是说a[2]和&a[2]数值上是相同的,但含义不同,&a[2]的类型和a相同的(提升了一级)本回答被提问者采纳
第2个回答  2012-04-07
&a[2]是二维数组第2行首地址(由0开始),这是因为把二维数组看作是“一维数组”,该“一维数组”的每个元素又是一个一维数组。&a[2]就是这种情况下“一维数组”第二个元素的地址,这个第二个元素实际上是一个一维数组。
&a[2][0]是二维数组第2行第0列元素首地址
所以二者相同。追问

我的理解是 int a[8][8] 等价于 int ((*a)[8])[8],
只是后者没有分配空间,对不对啊?

追答

应该是 int a[8][8] 等价于 int (*a)[8] 吧,至于分配空间的问题,应该是分配了,这我也不确定,没思考过这么个问题。

第3个回答  2012-04-07
定义的数组,其中,a[2]表示int类型的值。&a[2]表示该值的地址,也就是该行的起始地址。
楼主的第二条语句感觉是错的。。程序中还是不要用的好
第4个回答  2012-04-07
行首地址和该行首元素地址相同
相似回答