鱼C论坛

 找回密码
 立即注册
查看: 2852|回复: 5

关于二维数组的定义题

[复制链接]
发表于 2019-2-11 22:55:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问这题能不能给下详细解释
QQ截图20190211225436.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-11 23:20:25 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 人造人 于 2019-3-16 18:00 编辑

a、c、d 编译报错
b 能通过编译
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-12 00:21:23 | 显示全部楼层
A编译时就会报错,因为第二个里面没有数字,无法分配空间;B正确。可以根据给的数字,系统会自动计算出第一个【】里面的数字。C越界了,初始化编译时就会报错。D我感觉其实也没毛病。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-12 09:52:46 | 显示全部楼层
我选C
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-12 18:59:41 | 显示全部楼层
首先,为了便于下面的理解,我们首先来接受一个概念:
二维数组的初始化可以按行分段赋值,也可按行连续赋值。之所以可以这样操作,是因为:二维数组在概念上是二维的,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。那么,如何在线性内存中存放二维数组呢?在C语言中,二维数组是按行排列的。比如对于int a[5][3];也就是先存放 a[0] 行,再存放 a[1] 行,再存放 a[2] 行,再存放 a[3] 行,最后粗放a[4]行;每行中的 3 个元素也是依次存放。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(5×3)=60 个字节。
具体我们来看一个例子,对于数组 a[5][3],按行分段赋值应该写作:
int a[5][3]={ {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15} };
而按行连续赋值可以写作:
int a[5][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
这两种赋初值的结果是完全相同的。

那么好,上面我们重点说到了两个概念,一个是二维数组元素是连续存放的;另一个是二维数组是按行排列的。那么我们接下来再看三个概念:

1) 可以只对部分元素赋值,未赋值的元素自动取“零”值。例如:
int a[3][3] = {{1}, {2}, {3}};
是对每一行的第一列元素赋值,未赋值的元素的值为 0。赋值后各元素的值为:
1  0  0
2  0  0
3  0  0

再如:
int a[3][3] = {{0,1}, {0,0,2}, {3}};
赋值后各元素的值为:
0  1  0
0  0  2
3  0  0

2) 如果对全部元素赋值,那么第一维的长度可以不给出。例如:
int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
可以写为:
int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

3) 二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。
例如,二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。
这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

其实,我们从编译器的角度,对上面的规则很好理解:
我们之所以可以省略二维数组定义的一维指定(就是可以定义为int a[][3] ),是因为我们在初始化时,第一维的长度[]是可以直接通过初始化确定的;但是作为第二维的长度[3],因为有了3这个长度,所以在赋值时可以“只对部分元素赋值,未赋值的元素自动取“零”值”。

你完全可以把这个作为一种规则来记住:
二维数组第一维长度可以省略后通过初始化来确定;第二维长度需要指定,同时可以对第二维只对部分元素赋值,未赋值的元素自动取“零”。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-2-12 19:00:37 | 显示全部楼层
看了上面的分析,你就会理解,为什么答案为B。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 08:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表