CPP第四版第四章第一节:数组的定义和初始化
数组的定义和初始化:
数组的维数必须用值大于等于1的常量表达事定义。此常量表达式只能包含整型字面值常、枚举常量或者用常量表达式初始的整形const对象。
非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
显示初始化数组
在定义数组时,可为其元素提供一组用逗号分隔的初值,这些初值用花括号{}括起来,称为初始化列表:
const unsigned arrLen = 5
int intArr[arrLen] = {0, 1, 2, 3, 5};
如果没有显示提供元素初值,则数组元素会像普通变量一样初始化
在函数体外定义的内置数组,其元素均初始化为0;
在函数体内定义的内置数组,其元素无初始化
不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化如果该类没有默认构造函数,则必须为该数组提供初始化
特殊的字符数组
使用一组字符字面值初始化字符数组时,一定要记得添加结束字符串的空字符。
const char charArr[6] = {"Jenner"} ///这是错误写法,此数据的长度应该为7,如果用字符串初始化字符数组,数组长度为字符串长度+1("null")。
不允许数组直接复制和赋值
与vector不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组,这些操作都是非法的:
int intArr[] = {0, 1, 2}; //数组长度为3; int intArr2(intArr) ///错误,一个数组不能用另一个数组初始化 int main() { const unsigned arrLen = 3; int intArr1[arrLen]; int intArr2 = intArr1; ///错误 不能将一个数组赋值给另一个数组 return 0; }
习题4.1 假设get_szie是一个没有参数并返回int值的函数,下列哪些定义是非法的? 为什么?
unsigned buf_size = 1024; (a) int ia[buf_size]; //错误,buf_size是一个变量,不能定义数组的维长度 (b) int ia[get_size()]; //错误,get_size是一个运行时才能获取的变量值,不能定义数组的维长度 (c) int ia[4*7 - 14]; //正确; (d) chara st[11] = {"fundamental"}; //错误,用字符串初始化字符数组时,数组维长度应该是字符串长度+1(null 空字符)
习题4.2 下列数组的值是什么?
string sa[10]; int ia[10]; int main() { string sa2[10]; int ia2[10]; return 0; } sa和sa2的值分别是10个空字符串,ia在函数体外定义的内置数组,各元素初始化为0,ia2为在函数体内定义的内置数组,各元素未初始化,其值不确定
习题4.3 下列哪些定义是错误的:
(a) int ia[7] = {0, 1, 1, 2, 3, 4, 5}; //正确 (b) vector<int> ivec = {0, 1, 1, 2, 3, 4, 5};//错误,vector对象不能按这种方式初始化 (c) int ia2[] = ia; //错误,不能将一个数组赋值给另一个数组 (d) int ia3[] = ivec; //错误,不能用vector对象来初始化数组
习题4.4 如何初始化数组的一部分或者全部元素?
const int arrLen = 5; 1、int arr1[arrLen] ; 2、int arr2[arrLen] = {1,2,3}; //剩下的两位分别用0初始化掉 3、int arr3[] = {1,2,3}; //此方法可以省略数组长度 4、char arrChar[arrLen] = {"Jene"} //切记,字符串长度要比数组维长度小1 ...具体不罗列了。
习题4.5 列出使用数组而不是vector的缺点。
警告: 与vector类型不同,数组不提供push_back或者其它的操作在数组中添加新元素,数组一经定义,就不允许再添加新元素。 如果必须在数组中添加新元素,必须自己管理内存:要求系统重新分配一个新的内存空间用于存放更大的数组,然后再把原数组的所有元素复制到新分 配的内存空间中