返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++数组的定义详情
  • 336
分享到

C++数组的定义详情

2024-04-02 19:04:59 336人浏览 泡泡鱼
摘要

目录1.数组概念2.数组的复杂声明3.数组到指针4.数组操作4.1获取数组元素个数4.2使用for循环遍历数组(c++11开始支持)5.拓展5.1C字符串5.2vector5.3st

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


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++数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++数组的定义详情

本文链接: https://lsjlt.com/news/159381.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++数组的定义详情
    目录1.数组概念2.数组的复杂声明3.数组到指针4.数组操作4.1获取数组元素个数4.2使用for循环遍历数组(C++11开始支持)5.拓展5.1C字符串5.2vector5.3st...
    99+
    2024-04-02
  • C++中的数组详情
    目录1、数组2、数组的使用2.1 元素访问2.2 初始化3、C++11 的初始化方式1、数组 数组其实也是一种数据格式,不过是一种复合类型,它可以存储多个同类型的值。 使用数组可以将...
    99+
    2024-04-02
  • C++自定义数据类型方法详情
    目录1、typedef声明2、枚举类型enum1、typedef声明 typedef用于给已有的类型一个新的名字,这个新的名字可以是自己定义的, 其语法为: typedef 现有类型...
    99+
    2024-04-02
  • C++ 自定义单向链表 ListNode详情
     链表有两种:  1、带头结点,头结点存放的是链表的长度,从第二个节点开始存放数据。 2、不带头结点,没有存放链表长度的节点,从头结点开始就存放数据。 ...
    99+
    2024-04-02
  • c++中二维数组的定义
    在 c++ 中,二维数组的定义格式为:数据类型 数组名行数。元素通过 行索引 访问。可通过嵌套大括号或动态分配初始化。动态分配后需释放内存以避免泄漏。 C++ 中二维数组定义 定义格式...
    99+
    2024-05-08
    c++
  • C++数组指针和二维数组详情
    目录1、二维数组2、数组指针和二维数组1、二维数组 对于一维数组,int arr[10]; arr是数组名,也是首元素的地址,&arr是数组的地址,那么对于二维数组 int ...
    99+
    2024-04-02
  • c++模板自定义数组
    目录1.自定义数组.hpp--文件2.测试文件前言: 制造通用模板,创建自定义的数组, 一个数组,里面有这么几个属性,数组容量,数组元素个数,数组本身内存地址,这几个数据都是定义私有...
    99+
    2024-04-02
  • c++中数组怎么定义
    c++ 中数组是存储相同数据类型连续元素的内存块。定义数组语法为:数据类型 数组名[数组大小]。数组元素从 0 开始索引访问。数组特性包括:连续内存存储、固定大小、可作为参数或返回值。注...
    99+
    2024-04-26
    c++
  • vue3自定义指令详情
    目录一、注册自定义指令1.1、全局自定义指令1.2、局部自定义指令二、自定义指令中的生命周期钩子函数三、自定义指令钩子函数的参数四、自定义指令参数一、注册自定义指令 以下实例都是实现...
    99+
    2024-04-02
  • JAVA自定义注解详情
    目录原理:元注解:@Retention参数讲解:案例:给一个类的String属性设置默认值总结原理: 注解的本质是继承Annotation的特殊接口,其具体实现类是Java运行时生成...
    99+
    2024-04-02
  • c++可变数组如何定义
    在C++中,可变数组可以使用动态内存分配的方式进行定义和操作。以下是几种常见的定义可变数组的方式: 使用指针和new操作符: i...
    99+
    2023-10-28
    c++
  • c++中string数组怎么定义
    在C++中,可以使用以下方式定义一个包含多个字符串的数组: #include <iostream> #include &...
    99+
    2024-04-02
  • c++数组指针如何定义
    在C++中,可以使用以下方法来定义数组指针: int arr[5] = {1, 2, 3, 4, 5}; int *ptr = ar...
    99+
    2024-04-02
  • Go语言的变量定义详情
    目录一、变量声明变量二、短声明指针三、new函数四、变量的生命期五、变量的作用域一、变量 声明变量 go定义变量的方式和c,c++,java语法不一样,如下: var 变量名 类型,...
    99+
    2024-04-02
  • Python类的定义和使用详情
    目录一、前言二、定义类三、创建类的实例四、“魔术”方法——_ init _()五、创建类的成员并访问1.创建实例方法并访问2.创建数据...
    99+
    2024-04-02
  • C语言结构体数组的定义和使用详解
    目录介绍结构体数组定义时初始化补充介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗...
    99+
    2024-04-02
  • TypeScript数组的定义与使用详解
    目录基本定义声明数组时直接初始化访问数组Array对象声明数组时指定数组大小两种定义方式声明多维数组(含泛型)普通版泛型版类数组数组解构通过接口描述数组数组迭代基本定义 声明数组时直...
    99+
    2024-04-02
  • C#中怎么定义一个数组
    这篇文章给大家介绍C#中怎么定义一个数组,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#定义数组一、一维:int[] numbers = new int[]{1,2,3,4,5...
    99+
    2023-06-17
  • c#数组怎么定义和赋值
    在C#中,可以使用以下方式定义和赋值数组:1. 使用数组初始化器:```csharpint[] numbers = { 1, 2, ...
    99+
    2023-08-18
    c#
  • c语言怎么定义vector数组
    在C语言中,我们可以使用动态内存分配来定义一个类似于vector的数组。 首先,我们需要定义一个结构体来表示这个数组,其中包含一个指...
    99+
    2024-02-29
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作