C++ 数组

本文介绍了C++中数组的声明、初始化方法,包括默认和显示初始化,以及如何处理字符数组。还涵盖了数组元素的访问、指针的使用,如通过指针操作数组元素置零,以及比较两个数组是否相等的方法。

存放类型相同的对象的容器。数组大小不变。

初始化数组

1. 数组声明:

    A. T a[d]:T是数组元素类型,a是数组名字,d是数组的维度。

        注:在编译时,维度需已知。那么d必须是一个常量表达式,字面值或者const常量。

               数组类型T必须指明,不允许使用auto。

    B. 复杂声明:  ① int *ptrs[10];-------一个大小为10的数组,存储类型是整数指针(int *)

                          ② int (*Parray)[10];-------一个数组的指针,指向一个含有十个整数的数组。

2. 默认初始化 or 显示初始化
//默认初始化
int arr[10];

//显示初始化
const unsigned sz = 3;
int arr2[sz] = {0, 1, 2};  //数组长度为3,显示地用列表提供三个元素
int arr3[] = {0, 1, 2};    //不在[]中指明数组长度,那么将根据提供的初始化列表进行确定,数组维度为3
int arr4[5] = {0, 1};      //如果给定的初始化列表元素数目小于给定的数组维度,那么剩余的元素执行默认初始化
                           //注:可少不可多,给定的初始化元素数目不能超过了给定的数组维度

question:

下列数组中元素的值是什么?

string sa[10];
int ia[10];

int main() {
 string sa2[10];
 int    ia2[10];
}

 answer:

        在上述代码中,sa,ia位于所有函数体之外,是全局数组。sa2, ia2是局部数组。

        对于string类型的数组来说,因为string类本身接受无参数的初始化方式,所以不论数组定义在函数内还是函数外都被默认初始化为空串。即sa和sa2的元素值都为空字符串

        对于内置类型int来说,数组ia定义在所有函数体之外,根据C++的规定,ia(全局变量)的所有元素默认初始化为0;而数组ia2(局部变量)定义在main函数的内部,将不被初始化,如果程序试图拷贝或输出未初始化的变量,将遇到未定义的值

        注:如果是内置类型的变量未被显式初始化,它的值由定义的位置决定,定义于任何函数体之外的变量被初始化为0;定义在函数体内的内置类型变量将不被初始化,其值将是未定义的。

字符数组

注意:当使用字符串字面值初始化字符数组时,字符串字面值结尾的空字符'\0'将被存入字符数组

           因此,小心越界。

不允许拷贝和赋值

错误示范:int arr1[] = arr2; (X)

访问数组元素

1. 下标运算符(类型:size_t)

2.范围for语句

数组和指针的转换

1. 使用数组的时候编译器将其转换为指针的情况:

        ① 将数组名称当作赋值对象赋值给指针

        ② 使用auto

string nums[] = {"one", "two", "three"};
//指针指向数组首地址
string *p = nums //等价于string *p = &nums[0];
//auto得到的是指针
auto p2(nums);

2. 不会转换成数组的情况:

        使用decltype

decltype(nums) nums2;

标准库begin函数和end函数

分别用于获得指向数组首元素的指针和指向数组尾元素的下一位置的指针

int nums[] = {0, 1, 2, 3, 4, 5, 6, 7};
//指向数组首元素
int *beg = begin(nums);
//指向数组尾元素的下一元素
int *last = end(nums);

练习题

1. 编写一段程序,利用指针将数组中的元素置为0。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
  int vec1[8] = {1, 2, 3, 4, 5, 6, 6, 7};
  /*
  * 获取指向首元素的指针和尾后指针
  */
  int *ptr = std::begin(vec1);
  int *last = std::end(vec1);
  /*
  * 通过挪动指向首元素的指针遍历数组,知道首尾相遇
  */
  for(; ptr != last; ++ptr){
    *ptr = 0;
  }

  for(auto elem: vec1){
    cout << elem << endl;
  }
}

2. 编写一段程序,比较两个数组是否相等。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
  
  int nums1[8] = {1, 2, 3, 4, 5, 6, 6, 7};
  int nums2[3] = {1, 2, 3};
  /*
  * 分别获取两个数组的首指针和尾后指针
  */
  int *beg1 = std::begin(nums1);
  int *beg2 = std::begin(nums2);
  int *last1 = std::end(nums1);
  int *last2 = std::end(nums2);
  /*
  * 先对比两数组的元素是否相等,直到至少某一个数组遍历完
  */
  for(; beg1 != last1 && beg2 != last2; ++beg1, ++beg2){
    if(*beg1 != *beg2){
      cout << "not equal for elem" << endl;
      return 0;
    }
  }
  /*
  * 判断是否两个数组都遍历完了,如果是则两个数组相等
  */
  if(beg1 == last1 && beg2 == last2){
    cout << "equal" << endl;
    return 0;
  }
  /*
  * 如果不是,则两个数组长度不等
  */
  cout << "not euqal for length" << endl;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值