C++数组的定义详情

 更新时间:2022年01月24日 16:47:43   作者:一个热爱学习的深度渣渣  
这篇文章主要介绍了C++数组的定义详情,上一篇文章我们学习了类型,接下俩我们九在类型的基础上展开本篇内容数组的常用方法以及C++标准库提供的一些关于数组的容器,需要的朋友可以参考一下,希望对你有所帮助

上一篇讲解了类型,通过类型来开始本篇的学习;

int a[10];

上述代码中的a是什么类型呢?

相信很多人都知道是一个数组类型,具体来说是一个int[10]的类型;

1.数组概念

定义:将一到多个相同对象串连到一起,所组成的类型;

初始化方式:

  • 缺省初始化int x[5];
  • 聚合初始化int x[] = {1,2,3};

注意:

  • 不能用auto来声明数组类型;
  • 数组不能复制,也不能赋值;

2.数组的复杂声明

指针数组的声明:

int *i[5];

大家思考下i的类型是什么?

指针数组表示数组内的每个元素都是int*类型,所以i的类型为int *[5];

数组指针的声明:

int (*x)[5];

大家思考下x的类型是什么?

这里a是一个指针,类型为int(*)[5];

3.数组到指针

  • 使用数组对象时,通常会产生数组到指针的隐式转换;
  • 可通过引用声明来避免隐式转换;
int a[3] = {1, 2, 3};
auto b = a;  // b的类型为int*
auto &b = a; // b的类型为int(&) [3]

数组和指针的转换关系图

指向数值开头的指针很好获得,比如a、&(a[0])、std::begin(a);

获取指向数组结尾的指针(上图指向80):a+3、&(a[3])、std::end(a);

使用标准库获取开头和结尾指针的方法在别的数据类型也适用;

4.数组操作

4.1获取数组元素个数

int x[3];
// 方法一
std::cout << sizeof(x) / sizeof(int) << std::endl;
// 方法二
std::cout << std::size(a) << std::endl;
// 方法三
std::cout << std::end(a) - std::begin(a) << std::endl; 

方法三实际上是在运行期才执行的,增加程序运行耗时,不推荐;

方法一类型需要自己传入,适用性差,不推荐;

推荐用方法二;

4.2使用for循环遍历数组(C++11开始支持)

int a[3] = {1, 2, 3};
for (int x: a)
{
 std::cout << x << std::endl;
}

5.拓展

5.1C字符串

  • C字符串本质也是数组;
  • 声明一个字符数组并打印长度
#include <cstring>
char a[] = "Hello";
std::cout << strlen(a) <<std::endl;

使用函数strlen需要引入头文件cstring

5.2vector

定义:是C++标准库中定义的类模板;

与内建数组相比,更侧重于易用性(相对而言性能比内建数组差),可复制,可在运行期动态改变元素个数;
初始化与构建

// 1、聚合初始化
std::vector<int> x = {1, 2, 3};
// 2、其他初始化方式
std::vector<int> x(3, 1); // 个数为3,并且每个元素都为1

vector的初始化方式还有很多,可参考:https://en.cppreference.com/w/cpp/container/vector/vector

获取元素个数

std::cout << x.size() << std::endl;

判断为空

std::cout << x.empty() << std::endl;

尾部添加元素

x.push_back(2);  // 向容器中添加一个整数2

删除最后一个元素

x.pop_back();

打印vector中的元素

std::vector<int> x = {1, 2, 3};
x[2];   // 跟数组一样,越界不报错
x.at(2);  // 不可以越界

在标准库中的beginend函数,在vector中也有同名的方法并且作用相同,返回一个迭代器;

可以使用指针引用一个vector对象的方法:

std::vector<int> x = {1, 2, 3};
std::vector<int>* p = &x;
std::cout << p->size() << std::endl;

5.3string

定义:是C++标准库中定义的一个类模板特化别名,用于内建字符串的替代品;

  • 与内建字符串相比,更侧重易用性,可复制,可在运行期动态改变字符串个数;
  • 构造和初始化,可参考:https://en.cppreference.com/w/cpp/string/basic_string
  • 支持比较、赋值、拼接、索引、转换为C字符串(c_str());

6.思考

6.1思考以下代码输出什么?

int i[3] = {1, 2, 3};
std::cout << *(a) << std::endl;   // 第一行
std::cout << *(a + 1) << std::endl;  // 第二行

第一行的输出是1,第二行输出的是2,这就相当于a[0]和a[1]的值,说明数组底层也是指针实现,第二行中加一表示首地址地址移动类型大小的字节;

6.2以下代码能够编译通过吗?

int a[2] = {1, 2};
std::cout << a[100] << std::endl;

这个数组越界在C++中是可以编译通过的,会输出一个毫无关系的值,编译器不会有边界检查,需要特别注意!

6.3在另一个文件中定义了数组,如何在该文件中定义?

test.cpp:

int arr[3] = {1, 2, 3};

main.cpp:

extern int arr[];

上述声明称为不完整类型的声明,可以在main.cpp中找到test.cpp定义的数组;

总结:

本篇简要介绍了数组的常用方法以及C++标准库提供的一些关于数组的容器,大家也可以从思考部分来了解数组的一些细节;

到此这篇关于C++数组的定义详情的文章就介绍到这了,更多相关C++数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Struct结构体用法浅析

    C++ Struct结构体用法浅析

    前边我们所定义的类,均是使用struct关键字来定义,但是C++中真正用于定义类的关键字为class,因为要C++兼容C,所以保留struct关键字,struct与class的用法完全相同
    2023-03-03
  • OpenCV轮廓检测之boundingRect绘制矩形边框

    OpenCV轮廓检测之boundingRect绘制矩形边框

    在进行文本检测时,我们常常会用矩形边框将检测到的内容框除。这篇文章主要为大家介绍的是OpenCV中能实现这一效果的函数:boundingRect,感兴趣的同学可以学习一下
    2021-12-12
  • C++详解Primer文本查询程序的实现

    C++详解Primer文本查询程序的实现

    这个程序还是比较复杂的,把这句话作为文章的开头可以看出它的真实性.....这篇文章主要介绍了文本查询程序的实现,下面我们一起来看看
    2022-06-06
  • C语言实现图书管理系统开发

    C语言实现图书管理系统开发

    这篇文章主要为大家详细介绍了C语言实现图书管理系统开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言中free函数的使用详解

    C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下
    2017-05-05
  • OpenSSL使用AES实现文件加解密功能

    OpenSSL使用AES实现文件加解密功能

    AES是一种对称加密算法,它是目前广泛使用的加密算法之一,意味着加密和解密使用相同的密钥,这就要求密钥的安全性非常重要,因为任何拥有密钥的人都能进行加密和解密操作,本文给大家介绍了OpenSSL如何使用AES实现文件加解密功能,需要的朋友可以参考下
    2023-11-11
  • C++实现简单推箱子小游戏

    C++实现简单推箱子小游戏

    这篇文章主要为大家详细介绍了C++实现简单推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • c++重载运算符时返回值为类的对象或者返回对象的引用问题

    c++重载运算符时返回值为类的对象或者返回对象的引用问题

    这篇文章主要介绍了c++重载运算符时返回值为类的对象或者返回对象的引用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++线程同步实例分析

    C++线程同步实例分析

    这篇文章主要介绍了C++线程同步实例分析,以实例的形式较为深入的分析了C++的线程同步问题,是一个较为经典的线程同步问题,需要的朋友可以参考下
    2014-10-10
  • C++如何实现广义表详解

    C++如何实现广义表详解

    广义表是非线性结构,其定义是递归的。那么下面跟着小编一起看看如何用C++实现广义表,有需要的可以参考借鉴。
    2016-08-08

最新评论