C++数组的定义详情

目录
  • 1.数组概念
  • 2.数组的复杂声明
  • 3.数组到指针
  • 4.数组操作
    • 4.1获取数组元素个数
    • 4.2使用for循环遍历数组(C++11开始支持)
  • 5.拓展
    • 5.1C字符串
    • 5.2vector
    • 5.3string
  • 6.思考
    • 6.1思考以下代码输出什么?
    • 6.2以下代码能够编译通过吗?
    • 6.3在另一个文件中定义了数组,如何在该文件中定义?

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

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

(0)

相关推荐

  • C++数组指针和二维数组详情

    目录 1.二维数组 2.数组指针和二维数组 1.二维数组 对于一维数组,int arr[10]; arr是数组名,也是首元素的地址,&arr是数组的地址,那么对于二维数组 int arr[3][3], arr可以肯定是数组名,那么他是不是首元素的地址呢?如果是首元素的地址,那么arr[0]又该是什么呢?通过以下代码进行验证: #include <stdio.h> #define ROW 3 #define COLUMN 3 int main() { int arr[ROW][COLUM

  • C++变量,常量,数组和字符串详解

    目录 一.内存和寻址概述 二.变量 1.声明变量 2.变量的作用域 2.1 局部变量 2.2 全局变量 3.c++变量类型 3.1.bool布尔类型 3.2 char字符型 4.常量 总结 一.内存和寻址概述 可编程设备包含微处理器和一定数量的临时存储空间.临时存储器被称为随机存取存储器(RAM). RAM类似于宿舍里成排存物柜的存储区域,每个存物柜都有编号,即地址.要访问特定的内存单元,需要使用指令要求处理器从这里获取值或写入值. 微处理器负责执行应用程序,并从RAM中获取要执行的应用程序以及

  • 关于C++数组中重复的数字

    目录 1.题目描述 1.1 方法一:排序 1.2 方法二:哈希表 1.3 方法三:数组位置交换 2.题目升级 2.1 方法一:哈希表 2.2 方法二:辅助数组 2.3 方法三:二分查找 1.题目描述 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. 请找出数组中任意一个重复的数字. 题目示例: 输入:[2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 1.1

  • C++ vector数组用法及解析

    目录 一.什么是vector数组 二.vector的基本操作 vector数组的初始化 向vector中插入元素 删除元素 遍历数组 利用vector创建动态二维数组 一.什么是vector数组 vector是向量类型 vector数组是可以存放任意数据类型的动态数组 和普通数组类似,可以通过下标对数组中的元素进行引用 二.vector的基本操作 使用vector数组要在头文件中加 #include<vector> vector数组的声明 vector<int> vec;//声明一

  • 带你了解C++的数组与函数

    目录 数组作为函数的参数 数组参数的传递机制 数组作为函数的参数 传递首地址. A进行修改,a同时也会进行修改. 数组参数的传递机制

  • C++中的数组详情

    目录 1.数组 2.数组的使用 2.1 元素访问 2.2 初始化 3.C++11 的初始化方式 1.数组 数组其实也是一种数据格式,不过是一种复合类型,它可以存储多个同类型的值. 使用数组可以将同类型的变量整合起来管理,比如说我们现在要记录三个同学的考试得分.我们当然可以写成int a1, a2, a3;,看起来也不会很麻烦.但如果我们有 50 个同学呢?如果有 5000 个同学呢?显然就不能通过这种方式了,何况每个变量都要起一个独一无二的名字,这也很麻烦. 使用数组就不会有这样的问题,我们只需

  • C++数组的定义详情

    目录 1.数组概念 2.数组的复杂声明 3.数组到指针 4.数组操作 4.1获取数组元素个数 4.2使用for循环遍历数组(C++11开始支持) 5.拓展 5.1C字符串 5.2vector 5.3string 6.思考 6.1思考以下代码输出什么? 6.2以下代码能够编译通过吗? 6.3在另一个文件中定义了数组,如何在该文件中定义? 上一篇讲解了类型,通过类型来开始本篇的学习: int a[10]; 上述代码中的a是什么类型呢? 相信很多人都知道是一个数组类型,具体来说是一个int[10]的类

  • Go语言的变量定义详情

    目录 一.变量 声明变量 二.短声明 指针 三.new函数 四.变量的生命期 五.变量的作用域 一.变量 声明变量 go定义变量的方式和c,c++,java语法不一样,如下: var 变量名 类型, 比如 : var a int var在前,变量名在中间,类型在后面 我们以代码举例,如下: var i int = 0 var i = 0 var i int 以上三个表达式均是合法的,第三个表达式会将i初始化为int类型的零值,0:如果i是bool类型,则为false:i是float64类型,则为

  • Java二维数组简单定义与使用方法示例

    本文实例讲述了Java二维数组简单定义与使用方法.分享给大家供大家参考,具体如下: Java的二维数组是先创建一个一维数组,然后该数组的元素再引用另外一个一维数组.在使用二维数组的时候,通过两个中括号[]来访问每一层维度的引用,直到访问到最终的数据. public class MultiDimArray{ /** * @param args */ public static void main(String[] args) { int[][] arr = new int[3][]; arr[0]

  • 关于js二维数组和多维数组的定义声明(详解)

    声明一维数组:var goodsArr = []; 赋值:goodsArr[0] = 'First Value'; 这个毫无争议,因为平时使用PHP比较多,而php语法是可以直接使用goodsArr[0] = 'First Value'; 这种方法声明数组并赋值的,但js不能这样使用,必须先声明数组存在.同理,如果是二维和多维数组在使用前也必须声明二维和多维的数组,举例二维数组: var goodsArr[0] = []; 必须先这样声明一下二维数组才能使用二维数组,否则会出错的. 以上就是小编

  • PHP数组的定义、初始化和数组元素的显示实现代码

    从ASP初入门到PHP,感觉到PHP的强大之一就是内置函数的丰富,比如先前学习的PHP日期时间函数,读写文件的相关函数等都无不表明了PHP的更专业.更令用户的使用得心应手. 一开始我对PHP函数的丰富功能很兴奋,随着对越来越多近乎变态多的函数接触之后,突然联想到了ASP内置函数的稀少,要完成某项特殊功能,常须自定义函数,随着应用的在增多,自己居然也有了一套常用的函数库.然而现在在PHP中,这些功能早已被标准化.规范化而浓缩为内置函数直接使用,曾经的ASP开发人员成为了PHP的普通用户. 但转念一

  • PHP学习之数组的定义和填充

    PHP的数组,说白了,就是关联数据每一条数组都是以[索引,值]的形式保存的.其中索引默认是以0开始的数字.在未指定索引时,PHP会从0开始自动生成索引.当指定一个索引,PHP会从你指定索引最大正整数的下一个整数开始.如果你指定的是小数,PHP会取整数部分做为索引. 另外说说数组其它一些小东西: array()可以声明一个空数组: array[] = $value 在数组存在时,追加一个数据:在数组不存时,生成一个数组,并追加数据. array[$index] = $value 在数组存在时,追加

  • JavaScript数组的定义及数字操作技巧

    一.数组的介绍 数组中的元素类型可以是数字型.字符串型.布尔型等,甚至也可以是一个数组. 二.定义数组 1.通过数组的构造函数来定义数组: var arr=new Array(); var arr=new Array(size); var arr=new Array(element1,element2,...); 2.直接定义数组: var arr=["字符串",true,13]; ps: 和Object一样,此写法不会调用Array()构造函数. 三.数组元素 1.存取数组元素:通过

  • javascript中数组的定义及使用实例

    本文实例讲述了javascript中数组的定义及使用方法.分享给大家供大家参考.具体分析如下: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xht

  • java中数组的定义及使用方法(推荐)

    数组:是一组相关变量的集合 数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组.二维数组.多维数组 数据的有点 不使用数组定义100个整形变量:int i1;int i2;int i3 使用数组定义 int i[100]; 数组定义:int i[100];只是一个伪代码,只是表示含义的 一维数组 一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的, 使用java数组,必须经过两个步骤,声明数组和分配内存给该数组, 声明形式一 声明一维数组:数据类型

  • Java数组的定义、初始化、及二维数组用法分析

    本文实例讲述了Java数组的定义.初始化.及二维数组用法.分享给大家供大家参考,具体如下: 数组的定义 1.数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来做唯一标识. 数组的分类 一维数组 二维数组 多维数组 数组的优点: 例如:定义100个整型变量.用数组很方便. 数组声明: 1.int [] array; 2.int array []; 数组的声明以及内存的分配 1.为数组分配内存空间,如果不分配内存,将不能访问它的任何元素.我们使用new关键字来为数组分配内存空间. int

随机推荐