数组类型:该类型的变量空间中连续顺序的存放着多个同类型元素
N维数组:
定义语句语法:
元素类型(T) N维数组名[M1][M2]......[Mn]={ {} ,{},{...N层嵌套...} };
1.sizeof
sizeof(N维数组名)=M1*M2*...*Mn*sizeof(T)
2.N维数组定义的作用
3个基本作用+N个额外作用
#3个基本作用:
1、给该数组分配sizeof(N维数组名)个字节的内存空间
2、该空间命名为N维数组名
3、该空间中每sizeof(T)个字节面熟一个T类型的元素
#N个额外作用
1、相当于定义M1个N-1维数组,他们的名字叫做 :N维数组名[第一维下标X1] X1----->[0,M1-1]
2、相当于定义M1*M2个N-2维的数组,他们的名字叫做:N维数组名[第一维下标X1] [第二维下标X2] X2---->[0,M2-1]
............
N-1、相当于定义M1*M2*....*Mn-1个一维数组,他们的名字叫做:N维数组名[第一维下标X1] [第二维下标X2]...[倒数第二维下标]
N、相当于定义M1*M2*...*Mn-1*Mn个元素的变量,他们的名字叫做:N维数组名[第一维下标X1] [第二维下标X2]..[倒数第二维下标] [最后一维下标]
#数组的维度:数组嵌套的层数,对N维数组进行等分的轮数
3、支持运算和常用操作代码
表达式按其使用性质分为两类
(1)、左值表达式----用法:
该表达式的运算结果其本质是一块内存空间的名字
<1> 左值表达式= ....
<2>变量名=其他表达式 运算符 左值表达式
(2)、右值表达式----用法:
<1>变量名=其他表达式 运算符 右值表达式
不可以:右值表达式=....(错误错误错误)
针对整个N维数组空间的运算
&N维数组名
sizeof(N维数组名)
N维数组名=.....(错误用法)
针对N维数组中元素的运算:
(1)、针对名称为N维数组名[第一维下标] 的N-1维数组的运算
等同于同类型的N-1维数组的运算
即 N维数组名[第一维下标]----其本质是一个N-1维数组的数组名
(2)、针对名称为N维数组名[第一维下标] [第二维下标] 的N-2维数组的运算
等同于同类型的N-2维数组的运算
即 N维数组名[第一维下标] [第二维下标]----其本质是一个N-2维数组的数组名
(3)、针对名称为N维数组名[第一维下标] [第二维下标]...[最后一维下标] 的元素的运算
等同于同类型变量的运算
即 N维数组名[第一维下标] [第二维下标]...[最后一维下标]----其本质是一个元素类型的变量名
(4)、N维数组中所有元素的遍历:
N层嵌套循环
4、N维数组类型作为函数形参类型
C语言从函数调用时传参的效率(空间效率和时间效率)考虑,并不将其看待成数组,而将其看待成一种指向N-1维数组的 数组指针(如果N为1,则其就是指向元素类型的一级指针)
因此,N维数组类型作为函数参数类型的特点等同于 同类指针类型作为函数形参的特点。
5、N维数组类型作为函数返回值类型
任意数组类型都不可以作为函数的返回值类型
口诀:
总决:N维数组总可以看待成一维数组,这个一维数组中的元素类型为N-1维数组类型
分决:
1、表达式中单独书写N维数组名时-----此时N维数组名是其下标为0的元素的空间首地址
2、N维数组类型作为函数形参类型时----此时该形参是指向数组中元素的指针
另一种理解:
N维数组名在表达式中单独书写(&、sizeof除外)时,等价于 下标为0的那个N-1维数组所在空间的首地址。
N维数组类型作为函数形参类型时,等价于 指向N-1维数组的数组指针