为什么多维数组必须声明列数,而对行数没有要求???
2014-03-16 17:33
288 查看
多维数组:
多维数组本质上是一维数组,只不过每个数组元素不是一个简单变量,而是一个数组(即数组中存储的元素也是一个数组)
多维数组在作为函数参数的时候必须声明列数,而对行数没有要求。
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++ // 这样的操作的时候,指针一次该移动几个字节。但是对于多维数组,机器结构中是没有的,必须由程序员显示的告诉机器你现在创造的这个新的“元素类型”在我的机器里面占用多少个字节,否则我不知道该怎么移动。
数组并不是一定要声明长度,只有作为全局变量或者静态变量的数组才必须在定义的时候说明数组的长度,这样来看,多维数组不声明行数也是有条件的。
多维数组本质上是一维数组,只不过每个数组元素不是一个简单变量,而是一个数组(即数组中存储的元素也是一个数组)
多维数组在作为函数参数的时候必须声明列数,而对行数没有要求。
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++ // 这样的操作的时候,指针一次该移动几个字节。但是对于多维数组,机器结构中是没有的,必须由程序员显示的告诉机器你现在创造的这个新的“元素类型”在我的机器里面占用多少个字节,否则我不知道该怎么移动。
数组并不是一定要声明长度,只有作为全局变量或者静态变量的数组才必须在定义的时候说明数组的长度,这样来看,多维数组不声明行数也是有条件的。
相关文章推荐
- 头文件中只能声明变量不能定义变量 而声明变量必须带extern,为什么头文件中变量的声明都没有加
- 关于“数组内所储存元素的数据类型必须相同”和“声明时若没有指定数组的数据类型则默认为变体型”的真实性验证
- 为什么在把多维数组传递给函数时必须要指定除第一维之外的其他维
- 为什么没有三维指针的疑问以及多维数组的用处
- 编写一个C#程序,要求定义一个行数和列数相等的二维数组, 并执行初始化,然后计算并输出数组两条对角线上的元素之和。
- 要有个责任,奥巴马所说的:“必须多谈及责任这个词了”,不论你完成没有,你时刻都得有这个词,就算没完成,搞清楚是为什么没完成?要怎么办?有些人总喜欢子在这个时候下决心说下次一定努力又意思吗?
- 二维数组的列排序 考虑问题的全局性 声明数组必须要分配内存并清零
- 为什么要声明静态(static)数组
- Java接口中的成员变量为什么必须声明为public static final?
- 数组越界为什么没有出错?
- C#获取多维数组的行数与列数
- 互换二维数组的行列。要求数组的行数、列数以及各元素均从键盘输入;输出互换前数组内容和互换后数组内容。(要求循环输入进行测试)Java
- python统计多维数组的行数和列数实例
- C语言问题:为什么可以留着数组中第一维的参数不进行说明,但是其他维数必须说明呢?
- C语言中,为什么没有把long转化成字符数组的函数?
- 三维数组 多维数组 的声明 和添加
- 为什么js放在head部分没有反应,必须放在body部分下才会起作用
- 实验 8 数组2 输出一张九九乘法口诀表。要求必须将乘积放入一个二维数组中,再输出该数组
- Thread匿名内部类为什么 必须声明为final变量?
- 为什么数组可以不加“&”取它的地址,而普通变量必须要加“& ”才可以呢?