多维数组:
多维数组本质上是一维数组,只不过每个数组元素不是一个简单变量,而是一个数组(即数组中存储的元素也是一个数组)
多维数组在作为函数参数的时候必须声明列数,而对行数没有要求。
EX:
f(int day[2][12]){}
f(int day[ ][12]){}
f(int (*day)[12]){}
以上三种声明形式都是合法的,且效果相同。
其中第三种方式中(*day) 中的括号不能省略,这样的声明表示 参数是一个指针,它指向具有12个整型元素的一维数组。由于[]的优先级比*高,如果去掉括号,那么意义完全就变了。
int *day[12];//表示一个指针数组。
那为什么多维数组必须指明列数,而对行数没有要求呢?
其实,上面可以这么理解:
我们平时声明一个数组如下:
int array[10] ;// 表示一个含有10个int类型元素的一维数组,数组的名字叫 array
int (*array)[10];// 我们和上面比较来看,发现 *array 就相当于 array。也就是说该声明形式仍然表示一个一维数组,数组里面存储了10个int型的变量,数组的名字叫 *array. 再根据指针的意义,*array实际是取array 所指向的内容,而array 正好是数组的名字,这就好比 int a[10]; *a 是一样的。*a表示取出数组第一个元素的内容,*(a+1)表示数组第二个元素的内容。。。。因此,这里的*array也就是数组array的第一个元素的内容了。由于在int a [10] 中,元素是int型的,因此编译器知道 a+1 实际是移动32位,即4个字节(假设该机器用4个字节表示一个int 类型)。 对于*array ,它的元素不是简单的int ,它的每一个元素是一个包含10个int型元素的数组,因此。如果执行 array+1; 则会移动 10*32 = 320 位,也就是需要移动10*4=40个字节(一个int 占用4个字节,每个元素里面包含10个int )。这也就解释了为什么声明多维数组的时候对行数没有要求,但是必须声明列数。因为如果不声明列数,当执行array + 1;这样的操作的时候,数组不知道指针该移动多少位。为了让指针知道自己应该移动多少位,就必须把列数说明清楚。实际上列数的作用就相当于简单类型中的机器结构的作用,一个机器中int 类型使用几个字节,占用多少位,都是机器规定好的,即机器的结构决定了在执行比如int a[10]; a++ // 这样的操作的时候,指针一次该移动几个字节。但是对于多维数组,机器结构中是没有的,必须由程序员显示的告诉机器你现在创造的这个新的“元素类型”在我的机器里面占用多少个字节,否则我不知道该怎么移动。
数组并不是一定要声明长度,只有作为全局变量或者静态变量的数组才必须在定义的时候说明数组的长度,这样来看,多维数组不声明行数也是有条件的。
————————————————
版权声明:本文为CSDN博主「慢步云端」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shouxindejava/article/details/21331107
为什么函数声明和定义中的一维数组形参无须写明元素数目
因为函数并不为数组参数分配内存空间。形参只是一个指针,它指向的是已经在其他地方分配好内存的空间,这个事实解释了为什么数组形参可以与任何长度的数组匹配——它实际传递的只是指向数组第一个元素的指针。
但是二维数组或者二维数组指针定义时候不指明行数,初始化的时候是必须要指明的。