C++学习笔记之数组

news2024/9/24 3:25:21

C++学习笔记之数组

https://www.runoob.com/cplusplus/cpp-arrays.html

C++当中,数组是用于存储固定大小相同类型元素顺序集合

数组是整体作为一个变量,其中又包含多个单独变量,作为其元素,如数组变量a,其包含a[0]~a[n]若干个元素作为一个个单独的变量
借助索引可以访问特定的元素

数组由连续的内存位置组成,比如长度为N的数组,对应的就是连续N个内存位置
内存位置由低到高,对应数组0~N-1的下标元素

1、声明数组

在声明数组的时候需要指定元素的类型和数量

类型 数组名[数组长度];

数组长度:大于0的整数常量
类型:任意有效C++数据类型

int arr[3];

2、初始化

数组可以逐个初始化或者使用一个初始化语句

int arr[3] = {1, 4, 7};

需要注意,{}中的元素个数不能多于[]中声明的元素个数
当然,也可以不指定[]中的数组长度,这样就按后面{}的元素个数初始化

int arr[] = {1, 4, 7};

对特定元素进行赋值:

arr[1] = 20;

在这里插入图片描述

3、访问数组元素

可以通过数组名加上索引的方式访问数组中指定的元素

int value = arr[1];

4、多维数组

超过一维的便是多维数组了,通常定义为:

类型 数组名[数组长度1][数组长度2]...[数组长度N];
int arr[2][3][4];

4.1、二维数组

多维数组最简单的形式是二维数组
本质:一维数组的列表

类型 数组名[x][y];

在这里插入图片描述

4.1.1、初始化

有两种写法:
可以按行初始化,也可以整体赋值

int arr[2][3] = {   // 每行是3个元素数组
	{1, 2, 3},
    {4, 5, 6}
};
int arr[2][3] = {1, 2, 3, 4, 5, 6};   
4.1.2、访问元素

组合两个维度的索引进行定位

int value = arr[1][2];

5、指向数组的指针

int arr[3];

数组变量arr可以看作是指向&arr[0]的指针,也就是指向数组第一个元素的位置,即首地址

int arr[3];
cout << arr << endl;   // 数组变量(相当于arr[0]地址)
cout << &arr[0] << endl;    // 取第一个元素的地址

在这里插入图片描述
数组名就是指向数组第一个元素的常量指针

int *p;
int arr[3];
p = arr;

使用数组名作为常量指针是合法的,反之亦然
将数组名赋值给指针,那么指针就指向该数组的首地址,可以借助指针对于数组进行一些操作

int *p;
int arr[3] = {1, 3, 4};
p = arr;
cout << *(p + 2) << endl;
cout << arr[2] << endl;

在这里插入图片描述

在这里*(p + 2)arr[2]的取值是一样的,都是4
arr[2]代表的是数组arr的第三个元素,从arr[0]开始,往后两个,这也就是(p + 2)代表的含义,前面我们了解到,数组是一块连续的内存,因而当p = arr后,p就指向arr[0]的地址,往后移动两个,指针变量便加2,移动两个步长(与指针变量的类型有关),因此(p + 2)就指向arr[2]的地址,等价于&arr[2],借助*(解引用)从该内存中取出内容,便是arr[2]

6、传递数组给函数

C++ 中可以通过指定不带索引的数组名来传递一个指向数组的指针
因此,传递数组作为参数,会自动转换为传递指针,那么指针的实质其实就是内存地址

对于编译器来说,这些数组的传递无非就是对应类型的指针

方式一:
很实在,本来就是指针,摊牌了

void myFunc(int *p) {    

}

方式二:
已定义大小的数组,满满的仪式感,数组该有的都得安排

void myFunc(int arr[3]) {

}

方式三:
未指定大小的数组,仪式感兼顾,折中一点

void myFunc(int arr[]) {

}

这几种函数都支持接收数组作为参数,但是数组作为函数的参数时,编译器并不会进行边界检查,因此方式二的声明方式稍显多余,作用并不比注释大

void myFunc1(int *p)
{
    for (int i = 0; i < 5; i++)
    {
        cout << *(p + i);
    }
    cout << endl;
}

void myFunc2(int arr[3])
{
    for (int i = 0; i < 3; i++)
    {
        cout << arr[i];
    }
    cout << endl;
}

void myFunc3(int arr[])
{
    for (int i = 0; i < 5; i++)
    {
        cout << arr[i];
    }
    cout << endl;
}

int main()
{

    int arr[] = {1, 3, 4, 7, 5};
    myFunc1(arr);
    myFunc2(arr);
    myFunc3(arr);
}

在这里插入图片描述

7、从函数返回数组

C++不允许返回一个完整的数组作为函数的参数,但是可以通过指定不带索引的数组名来返回指向数组的指针

int* myFunc()    // 返回指针类型
{
    
}

如果使用数组名返回,就是如下场景:
在这里插入图片描述
但是这样写存在问题,我们运行一下就知道了

int main()
{
    cout << *myFunc() << endl;
}

在这里插入图片描述
local反复被提及,说明是局部变量的问题
因为当函数结束时,局部数组将被销毁,指向它的指针将变得无效
C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为static变量

int* myFunc()
{
    static int arr[3] = {1, 4, 7};   // 添加static关键字
    return arr;
}

或者,也可以使用动态内存分配的方式

int* myFunc()
{
    int* arr = new int[3];   // 动态申请内存
    arr[0] = 1;
    arr[1] = 4;
    arr[2] = 7;
    return arr;
}
int main()
{
    int* p = myFunc();
    cout << *p << endl;
    delete[] p;   // 注意释放内存
}

当使用动态分配数组时,要注意释放返回的数组
这是因为在函数内部分配的数组在函数结束时不会自动释放,避免造成内存泄漏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html+css+js网页制作 淘宝首页1个页面带js

htmlcssjs网页制作 淘宝首页1个页面带js 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&…

【并查集、树的直径】P2195 HXY造公园 题解

题意 P2195 codeforces 455c&#xff0c;两道一样的题 给出一个由 n n n 个点&#xff0c; m m m 条边组成的森林&#xff0c;有 q q q 组询问,每次询问有以下两种情况 输入 o p 1 op 1 op1 时&#xff1a;给出点 x x x&#xff0c;输出点 x x x 所在的树的直径。 输…

千元不到,作为可穿戴AI设备,AI Friend真的能够取代手机吗?

在人工智能的浪潮中&#xff0c;我们见证了无数旨在提高效率和生产力的创新设备。 然而&#xff0c;Friend设备以其独特的设计理念&#xff0c;为AI设备带来了新的定义——一个永远在线的伴侣&#xff0c;一个情感的稳定器。 一、Friend的设计理念 Friend设备的设计初衷并非追…

vscode的C/C++环境配置和调试技巧

目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…

Qt 中实现异步散列器

【写在前面】 在很多工作中&#xff0c;我们需要计算数据或者文件的散列值&#xff0c;例如登录或下载文件。 而在 Qt 中&#xff0c;负责这项工作的类为 QCryptographicHash。 关于 QCryptographicHash&#xff1a; QCryptographicHash 是 Qt 框架中提供的一个用于生成加密散列…

【系统维护】Dll文件修复工具使用教程,Windows系统必备!

一、dll文件是什么 dll文件是是一种Windows操作系统下的可执行文件格式&#xff0c;包含可由多个程序同时使用的代码和数据的文件&#xff0c;它的主要作用是实现代码和数据的共享&#xff0c;从而节省内存和硬盘空间&#xff0c;并提高程序的性能和可维护性 二、如何解决dll文…

刚刚,模糊测试平台SFuzz受到行业认可

近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;正式发布了“2024年网络安全优秀创新成果大赛-安全严选专题赛”评选结果&#xff0c;开源网安模糊测试平台SFuzz凭借重大创新能力&#xff0c;得到组委会认可&#xff0c;获本次大赛创新产品优胜奖。 2024年网…

【LeetCode面试150】——392判断子序列

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

数据结构--第八天

--哈希表 -哈希表的概念 哈希表&#xff1a;用散列法存储的线性表被称为哈希表&#xff0c;使用的函数被称为散列函数或者哈希函数&#xff0c;f(k)被称为散列地址或者哈希地址。。通常情况下&#xff0c;散列表的储存空间是一个一维数组&#xff0c;而哈希地址为数组的下标 -哈…

【C# WPF】Style全局样式和资源字典

1.全局样式&#xff1a; 在Window.Resource中声明一个样式&#xff0c;总体为白色&#xff0c;为了更有区分度&#xff0c;采用BasedOn这一继承方式来在保留字体和边缘设置的基础上&#xff0c;更改颜色。 <Window x:Class"WpfApp1.Window1"xmlns"http://s…

LangChain 推出 LangGraph Studio:首款用于可视化、交互和调试复杂代理应用的代理 IDE

嘿&#xff0c;听说了吗&#xff1f;Langchain最近发布了一项重大更新&#xff0c;他们推出了官方Agent IDE&#xff0c;并且免费开放了LangGraph平台。这对于AI开发者来说是个好消息&#xff0c;意味着我们现在有了更强大的工具来构建智能应用。 今天&#xff0c;我们就来分享…

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…

HTTP、HTTPS、SOCKS5 三种协议特点详解

一、引言 在当今数字化的世界中&#xff0c;网络通信协议扮演着至关重要的角色。HTTP、HTTPS 和 SOCKS5 是三种常见的网络协议&#xff0c;它们各自具有独特的特点和应用场景。本文将对这三种协议进行详细的分析和比较&#xff0c;帮助您更好地理解它们在网络通信中的作用。 …

vue2+OpenLayers 天地图上打点并且显示相关的信息(2)

上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…

多模态大语言模型(MMLLM)的现状、发展和潜力

1、大模型 随着ChatGPT流行&#xff0c;大模型技术正逐渐成为AI领域的热点。许多行业大佬纷纷投身于这一赛道&#xff0c;展示了大模型的独特魅力和广阔前景。 王慧文&#xff0c;前美团联合创始人&#xff0c;发起“AI英雄帖”。 李志飞&#xff0c;出门问问创始人&#xff0…

7个Agent组成的公司,7分钟完成了一个游戏的开发

来源丨投资实习所&#xff08;ID&#xff1a;startupboy&#xff09; 作者丨StartupBoy 市场对 AI Agent 的期望一直很高&#xff0c;除了各种单向任务的 Agent 外&#xff0c;之前斯坦福大学和 Google 的一项实验已经展示了由 25 个 AI Agent 自行协同运行的虚拟城镇&#x…

如何使用Zoom API创建一个会议?

一、注册一个免费的Zoom账号&#xff08;zoom.us) 二、在Zoom 应用市场&#xff08;App Marketplace)创建一个server to server 的app&#xff0c;授予创建会议的权限。 三、创建一个Zoom API的服务端程序(node.js) 1、git clone https://github.com/zoom/server-to-server-o…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

Python-调用pymysql库,执行插入语句

今天写了一个mysql的插入方法&#xff0c;传多条数据时报错: TypeError: not enough arguments for format string 解决:后来排查是因为调用方法是&#xff0c;用的cursor.excute()&#xff0c;导致的报错&#xff0c;改为cursor.excutemany()就插入成功了 方法调用: test.ins…

【ARM CoreLink 系列 5.5 -- CI-700 Debug trace and PMU 】

文章目录 Debug trace and PMUCI-700 Debug trace 系统概述DTC DomainDTC Domain 约束条件DTM device portsDTM FIFO BufferDTM FIFO 缓冲区特点Debug trace and PMU 本篇文章主要是介绍 CI-700中实现的 Debug Trace (DT) and Performance Monitoring Unit (PMU). CI-700 Deb…