c语言二维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、然后就可以为其赋值并输出【代码如图】,就完成了。

参考技术A 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相同的(提升了一级)本回答被提问者采纳
参考技术B &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] 吧,至于分配空间的问题,应该是分配了,这我也不确定,没思考过这么个问题。

参考技术C 定义的数组,其中,a[2]表示int类型的值。&a[2]表示该值的地址,也就是该行的起始地址。
楼主的第二条语句感觉是错的。。程序中还是不要用的好
参考技术D 行首地址和该行首元素地址相同

C语言怎么用for循环为二维数组赋值?请举个例子。

C语言怎么用for循环为二维数组赋值?请举个例子。

参考技术A 给m*n二维数组赋值1~m*n
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=i*m+j;本回答被提问者和网友采纳

以上是关于c语言二维数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言二维数组问题

c语言二维数组 赋值

C语言函数传递二维数组

C语言 指针初始化二维数组

c语言中如何通过二级指针来操作二维数组

c语言中怎样实现对二维数组元素进行赋值并输出。