注:部分来源于网络相关资料,用于个人总结学习记录,如有侵权,请联删。
1,一维数组定义
数组就是一组相同类型数据的集合
一维数组的定义形式为:
元素类型 数组名[常量表达式];
一维数组是由元素类型,数组名和长度组成的构造类型。例如:
Int a[10];元素是整型
注:
1,数组名必须符合c++标识符规范
2,常量表达式表示数组中元素的个数,称为数组长度。常量表达式的值必须为正整数且大于等于1
3,数组一经定义,数组长度就始终不变
如:
int n;
cin >> n;
int a[n]; //错误!
一维数组的内存形式:
c++规定数组元素是连续存放的,即在内存中一个元素紧跟着一个元素线性排列。
2,一维数组的初始化
可以在一维数组定义时对它进行初始化,初始化的语法形式如下:
元素类型 数组名[常量表达式] = {初值列表};
Int a[5] = {1, 2, 3, 4, 5};//一维数组初始化
说明:
(1)初始列表提供的元素个数不能超过数组长度,但可以小于数组长度。如果初值个数小于数组长度,则只初始化前面的数组元素,剩余元素初始化为0。例如:
(2)在提供了初值列表的前提下,数组定义时可以不用指定数组长度,编译器会根据初值个数自动确定数组的长度。例如:
可以用下面的表达式计算出数组A的长度:
sizeof(A)/sizeof(int);
(3)若数组未进行初始化,静态数组的元素均初始化为0;在函数体内定义的动态数组,其元素没有初始化,为一个随机值
如:static int A[10]; //默认各元素的值为0
Int A[10];//各元素的值为随机数
3,一维数组的引用
数组必须先定义后使用,且只能逐个引用数组元素的值而不能一次引用整个数组全部元素的值
(1)下标表达式可以是常量,变量,表达式,但必须是正整数,不允许为负值
数组元素下标总是从0开始。
(2)下标值不能超过数组长度,否则导致数组下标越界的严重错误。例如
(3)整个数组不允许进行赋值运算,算术运算符等操作,只有元素才可以。
4,多维数组的定义初始化
Int a[3][4];
Int b[3][4][5];
多维数组实际上是反复递归一维数组:即一维数组的每一个元素又是一个一维数组,就构成了二维数组。
本质上,c++的多维数组都是一维数组,这是由内存形式的线性排列决定的。因此,不能按几何中的概念来理解多维,多维数组不过是借用“维”的数字说法表示连续内存单元。
举例:int a[3][4];
假设每个元素占2个字节的存储空间,则存储结构图示:
多维数组的初始化,以二维数组来说明,初始化有两种形式。
(1)初值按多维形式给出:
Int A[2][3] = {{1, 2, 3},{4, 5, 6}};//初值按二维形式
(2)初值按一维形式给出:
Int a[2][3] = {1, 2, 3, 4, 5, 6};
初值列表提供的元素个数不能超过数组长度,但可以小于数组长度。如果初值个数小于数组长度,则只初始化前面的数组元素;剩余元素初始化为0.这个规则两种初始化形式都适用,例如:
在提供了初始化列表的前提下,多维数组定义时可以不用指定第一维的数组长度,但其他维数的长度必须指定,编译器会根据列出的元素个数自动确定第一维的长度。例如:
5,数组作为函数的参数
(1)数组元素作为函数的参数
一维数组元素可以直接作为函数实参使用,其用法与变量相同
(2)整个数组最为函数的参数
数组作为函数的形参,基本形式为:
数组的实参如何写?
只写数组名字,数组的名字就代表了首地址。传递的不是数值,数组作为参数传递的是首地址。
如果实参使用数组名调用,本质上是将这个数组的首地址传递到形参中
尽管数组数据很多,但它们均从一个首地址连续存放,这个首地址对应得正是数组名。
6, 数组参数的传递机制
数组作为函数的参数,传递的是数组的地址
这样的传递机制使得当数组作为函数参数时,有下面的特殊性
(1)由于形参数组就是实参数组,所以在被调函数中使用形参就是在间接使用实参,这点与变量作为函数参数的情况是不同的。
(2)既然形参数组就是实参数组,所以函数调用时不会为形参数组分配储存空间。
形参数组不过是用数组定义这样的形式来表明它是个数组,能够接收实参传来的地址,形参数组的长度说明也无实际作用。因此形参数组甚至可以不用给出长度。
(3)虽然实参数组将地址传到了被调函数中,但被调函数并不知道实参数组的具体长度,那么假定的大小对于实参数组来说容易数组越界。实际编程中可以采用以下方法来解决:
函数调用时再给出一个参数来表示实参数组的长度。
(4)多维数组作为函数的参数,形参数组第一维可以与实参相同,也可以不同;可以是任意长度,也可以不写长度;但其他维的长度需要相同。