C++数组
声明:
一维数组: <数据类型> <数组名> [常量表达式],常量表达式表示数组每一维所包含元素的个数。
二维数组: <数据类型> <数组名> [常量表达式][常量表达式]
访问:
<数组名> [下标表达式]
<数组名> [下标表达式][下标表达式]
下表从0开始
比如 int intArr[30],就从intArr[0]到intArr[29],编译器为这个数组分配了一块连续的存储空间,数组名实际上是这块存储空间的起始位置,指向首个元素的指针。
PS:为了保证编译效率,C++编译器不对数组下标进行越界检查,所以使用不当可能会出现run-time crash,因为对超过数组存储空间的访问是undefined的。
初始化:
double dArr[3]={90.0, 75.0, 85.0};
int a[2][3] = {2,4,6,8,10,12}; // (a[i]的每个元素是一个int类型的3元数组)前3个对a[0]的3个元素赋值,后三个对a[1]的3个元素赋值。
const int size = 3;
int a[2][size ] = { {2,4,6 } , { 8,10,12} };// 第一个{}内对a[0]赋值...
声明时不初始化,数组元素的值是随机的(PS:这与变量初始化的规则一致)。初始化表达式里面优先对前面的元素赋值,后面元素的初始值为0。
int a[2][3] = {2,4,6} // a[0][0] = 2, a[0][1] = 4, a[0][2] = 6, a[1][0] = 0, a[1][1] = 0,a[1][2] = 0
如果初始化表达式提供所有元素的初始值,数组第一维的长度可以省略。
double dArr[ ]={90.0, 75.0, 85.0};
int a[ ][3] = { {2,4,6 } , { 8,10,12} };
数组的特点:C++里的数组不如vector
1. 不能像普通变量那样整体拷贝或者赋值;
2. 不能整体作为参数传入函数,要么只能退化为指针,要么使用引用。
3. 不能作为函数返回类型(不是class类型,编译器不知其大小);
数组的数据类型可以是内置类型也可以是构造类型等,如果没有提供初始化函数,则数组元素的初始化与变量初始化的规则相同:
1. built-in type: defined outside the body of function(不是栈内)are initialized to zero。
2. built-in type: defined inside the body of function:undefined/ uninitialized
3. class type 无论在函数内还是函数外,元素由类的默认构造函数(如果有的话)初始化,如果无,元素必须只能被显式初始化。
因此除非我们显式地提供初始化函数,否则局部数组的元素(内置类型)都不会初始化,使用它们可能会导致未定义错误(除了赋值操作)。
字符数组
字符数组比较特别,可以使用{}方式初始化也可以使用字符串字面量(character string literal)来初始化
char ca1[] = {‘c’, ‘+’, ‘+’ }; // 无null character
char ca2[] = {‘c’, ‘+’, ‘+’ , ‘\0’ }; // 显式加null character
char ca3[] = “c++”; // 字符串字面量以null character结束,ca3自动加null
因此,char name[6] = “123456”; 是错误的,因为加上null character有7个字符