C++使用数组

96 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

C++数组.png

数组

数组和vector

  • 相同点

    • 存放的都是相同类型的对象
    • 通过下标访问数组内对象
  • 不同点

    • vector大小可变;数组大小在初始化时就确定不变,不能随意向数组增加元素

初始化数组

  • 数组声明形式:a[d]

    • a是数组名
    • d是数组的大小,编译时就必须已知的,也就说长度必须是一个常量表达式
    • 数组定义时,数组元素会执行默认初始化
    • 定义数组时必须明确指定类型,不能使用auto
    • 数组的元素必须是对象,因此不存在引用的数组
  • 显示初始化数组

     const unsigned sz = 3;
     int a1[sz];   //执行默认初始化,数组元素默认初始化0
     ​
     int a2[sz] = {1,2,3}; //含有3个元素的数组,分别初始化为1,,2,,3
     ​
     int a3[] = {1,2,3}; //根据初始值数量推断出长度是3
     ​
     int a4[5] = {1,2,3}; //数组长度是5,前3个元素是1,2,,3,后面元素都初始化为0
     ​
     int a5[2] ={1,2,3};//元素数量超过了数组定义的长度,错误
     ​
    
  • 数组不允许拷贝,不能将一个数组拷贝给另一个数组

     int a[] = {1,2,3};
     int a2[] = a;//错误,不能使用数组初始化另一个数组
     a2 = a;//错误,不能直接赋值
    

数组元素访问

  • 使用下标访问数组元素,即a[index]形式,和string或者vector访问是类似的
  • 使用指针访问,详细见数组和指针的文章
  • 使用迭代器访问
  • 数组本身没有迭代器对象,标准库提供了两个函数获取数组迭代器,即begin()end(),存在iterator头文件中

     include <iterator>
     ​
     int a[] = {1,2,3}
     int *beg = begin(a);  //指向首元素的指针
     int *end = end(a); //指向数组的尾后指针
     ​
    

获取到迭代器后也可以类似vector遍历数组了

和迭代器一样,这两个指针相减结果是他们之间的距离。类型是ptrdiff_t类型,一种带符号类型

多维数组

理解多维数组

  • 多维数组就是数组的数组。可以理解为一个数组的元素还是一个数组
  • 当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,另外一个维度表示其元素(也是数组)大小
  • 形式:a[x][y]; 即a是大小为x的数组,数组中每个元素都是数组,大小是y 常用的是二维数组,这时x称为行,y称为列

多维数组初始化

 //使用{}初始化一维数组,再每一个元素都是用{}进行初始化
 int a3[3][4] = {
 {0,1,2,3},
 {4,5,6,7},
 {8,9,10,11}
 };
 ​
 //不嵌套{}初始化也是可以的,本质上多维数组在内存中的排列也是线性的
 int a2[3][4]={0,1,2,3,4,5,6,7,8,9,10.11};
 ​
 //初始化二维数组的每行的首元素
 int a3[3][4] = { {0}, {4}, {8} };
 ​
 //初始化二维数组的第一行,其他都是默认初始化
 int a3[3][4] = {0,1,2,3};

数组访问

  • 使用双层for循环
  • 也可以转化为数组访问,详细见数组和指针多维数组部分