char levelNames[5][10] = {"贵人"}; 为什么定义了二维数组,却赋值为一维数组内容?
这个二维数组只是为它的第一个元素(第一个一维数组)赋值了,后续的元素没有赋值. 默认情况下会赋值为 0. 所以它的内存分布可以表示为:
贵人\0 | 0 | 0 | 0 | 0
地址: 0 10 20 30 40
就和
int a[3][2] = {
{1, 2}
};
是一样的,只为第一个一维数组赋值了,而题主中的第一个一维数组是一个字符数组,这里是一个整数数组.
首先,在C语言里,所谓的数组,都是栈里的一段连续空间,不管几维数组,都可以看成和一维数组一样的结构,因为空间都是连续的。
我们都知道,
int a[4]
,这个数组,在取值是可以使用*
,比如a[2]
就是*(a + 4)
。那么,当我们定义一个二维数组,
int b[2][3]
,a[1][2]
我们也可以写成*(b + 1 * 3 + 2)
。所以你的问题,其实是,当你定义了一个字符型的二维数组时,相当于定义一个“字符串”的一维数组,只是C语言里并没有字符串类型,通过字符数组来实现是一种常用的方式。
但是请注意这种方式定义和用指针定义有本质上的区别。