仅供参考,欢迎交流和指正 power by Qi
3.5.1 定义和初始化内置数组
1.数组和vector的区别之一在于数组的大小是固定的,灵活性不足。数组需要在编译时就确定数组大小,所以声明数组时,维度必须为常量表达式。
unsigned a = 1;
int b[a] ;//error
int b[get_size()];//get_size()为常量表达式时,正确
--------------------------------
constexpr unsigned a = 1;
int b[a]//正确
注意,这种方式定义的数组,其变量名字是一个常量,无法改变,虽然没有显示的声明,但是如果我们对其进行修改,编译器将会报错。
int a[10];
a=1;//报错
但是使用如果指针指向new出来的空间则不会报错
int *p = new int[3];
p++;//正确
2.内置类型的数组,在定义时如果没有显式初始化,会被默认初始化。就和内置类型的默认初始化一样,为全局变量时初始化为0,但是为局部变量时,通常是一个随机值。
3.数组的定义不能使用auto关键字,数组中的必须存放对象,因此不存在引用数组
4.数组在使用列表初始化时,可以不写明第一维的维度,如果写明了数组的维度,则列表中元素的个数要小于或者等于数组的维度。列表中的元素按照顺序初始化靠前的元素
int a[] = {
1,2,3,4};//true
int a[4] = {
1,2,3,4};//true
int a[4] = {
1,2,3};//true,
int a[4] = {
1,2,3,4,5};//error 初始化列表中元素的个数大于维度
int a[2][2] = {
1,2,3,4} //true 按照顺序初始化数组中的元素
//对于这种方法的进一步思考,可以视为多维数组在c++中是按照行优先的形式保存的
int a[10] = {
};//如果这样初始化,数组中的元素将指向值初始化,在这里是0
5.字符数组可以使用字符串字面值来初始化,注意字符串字面值的结尾包含了结束符’\0’,所以字符串的长度要+1,用于存储结束符。但是string类不会存储结束符。二者都会在第一次遇到结束符时,截取字符串。
char a[] = "hello \0 word";
string b = "hello \0 word";
cout << a << endl;
cout << b << endl;
--------------
hello
hello
6.数组不允许拷贝和赋值
int a [] = {
233,233,233};
int b[]=a;//error
int b[3];
b = a;//error
思考那么数组怎么传递参数呢?
7.复杂的数组声明
int arr[10];
int *p[10