数组是一种数据格式,能够存储多个同类型的值,一维数组可用来实现线性表的顺序存储、哈希表等,二维数组可用来保存图的邻接矩阵等。
1. 一维数组的声明与字符数组
1.1 一维数组的声明与初始化
(1) 一维数组的声明
一维数组声明应指出以下三点:
1) 存储在每个元素中的值的类型;
2) 数组名;
3) 数组中的元素数,数组的元素数必须用值大于等于1的常量表达式定义。
数组定义中的类型可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。数组定义中类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素必须可以被赋值。
虽然没有引用数组,但数组可以有引用。
【示例】定义数组a的引用。
1 int a[6] = {0, 2, 4, 6, 8, 10};
【解答】
1 int (&p)[6] = a;
如上,p是数组a的引用。数组的引用可以用于函数实参传递。此时可以确保传递过来的数组长度合乎要求。
(2) 一维数组的初始化
在定义数组时,可为其元素提供一组用逗号分隔的初值,这些初值用花括号{}括起来,称为初始化列表。
数组元素初始化时,若没有显式提供元素初值,则元素会被像普通变量一样初始化:
1) 函数体外定义的内置类型数组(即内置类型的全局数组),元素初始化为0;
2) 函数体内定义的内置类型数组,元素无初始化(注意,若只初始化部分元素,其后的元素此时也会被初始化为0);
3) 如果不是内置类型,则不管其在哪定义,自动调用其默认构造函数为其初始化,若该类无默认构造函数则会报错。
【示例】给定如下代码:(阿里巴巴)
1 int x[4] = {0}; int y[4] = {1};
数组x和y的值为____?
A. {0, 0, 0, 0}, {1, 1, 1, 1}
B. {0, 0, 0, 0}, {1, 0, 0, 0}
C. {0, 不确定}, {1, 不确定}
D. 与编译器有关
【解答】 B
1.2 C风格字符串与字符数组
(1) C风格字符串
C风格字符串包括两种:
1) 字符串常量
以双引号括起来的字符序列是字符串常量。为了兼容C语言,C++中所有的字符串常量都由编译器自动在末尾添加一个空格符。
字符常量‘a‘表示单个字符a,然而"a"是字符串常量,其表示字母a和空字符(null)两个字符。
2) 末尾添加了‘\0‘的字符数组
C风格字符串末尾必须有一个字符‘\0‘。
(2) 字符数组
字符数组既可以用一组由花括号括起来、逗号隔开的字符常量进行初始化,也可以用一个常量字符串(末尾有空格)进行初始化。然而要注意的是这两种初始化方式并不完全相同,因为字符常串常量包含一个额外的空字符用于结束字符串。当使用字符串常量值来初始化创建的新数组时,将在新数组末尾加入空字符。
【示例】给出以下定义,则正确的叙述为_____。(淘宝)
1 char x[] = "abcdefg"; 2 char y[] = {‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘};
A. 数组x和数组y等价
B. 数组x和数组y长度相同
C. 数组x的长度大于数组y的长度
D. 数组x的长度小于数组y的长度
【解答】C
2. 二维数组
2.1 二维数组的声明与初始化
二维数组是最常用的高维数组。一维数组可视为一行数据,二维数组更像是一个表格——既有数据行也有数据列。
二维数组的初始化有分为两种,一种是按行初始化。和处理一维数组一样,程序员可以使用由花括号括起来的初始化列表来初始化多维数组的元素。对于多维数组的每一行,可以再用花括号指定其元素的初始化行式:
1 int ia[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
另一种是顺序初始化:
1 int ia[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
C++规定,在声明和初始化一个二维数组时,如果对二维数组的所有元素都赋值,则第一维(行数)可以省略。但注意第二维不能省略。同样,在声明更高维的数组时,也只有第一维可以省略。
2.2 行优先存储与列优先存储
二维数组的行优先存储是指在内存中,先将二维数组的第一行按顺序存储,接着就是第二行的数据,然后是第三行的数据……
二维数组的列优先存储是指在内存中,先将二维数组的第一列按顺序存储,接着就是第二列的数据,然后是第三列的数据……
在C/C++中,二维数组是按照行优先顺序连续存储的。
【示例】有一矩阵大小为16K*16K,若对两个这样的矩阵做加法运算,行优先读取与列优先读取的区别是_____?(腾讯)
A. 一样快 B. 行优先快 C. 列优先快 D. 无法判断
【解答】B