《C++程序设计》阅读笔记【3-数组】

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:《C++程序设计》阅读笔记

本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C++程序设计获取下载链接。


  • 1 数组
    • 1.1 概述
    • 1.2 数组初始化
      • 1.2.1 概述
      • 1.2.2 字符数组的初始化
      • 1.2.3 省略数组大小
    • 1.3 向函数传递数组
    • 1.4 二维数组
      • 1.4.1 初始化
      • 1.4.2 省略第一维大小
      • 1.4.3 二维数组的降维
  • 2 总结


1 数组

1.1 概述

char buf[5]; //5表示元素的个数

这个字符数组可以是最长为4个字符的单词,因为第5个字节用于'\0'字符,用'\0'字符结束的字符数组构成一个字符串。

数组定义的方括号中,常量表达式可以包含枚举常量和字符常量,该常量表达式的值是在编译时确定的。因为要为数组分配长度固定的空间。假如不是常量,则每次编译时分配给数组的空间都不一样,这是不行的

熟悉下面的例子:

注意:即使size是全局变量,也是不行的。但假如size是常量,例如:const int size=1,那么int array[size]是可以的

image-20240228134019702

全局作用域下的数组、和静态局部作用域下的数组,其初始值为全0。而局部作用域下的数组存储在栈区,其值是不确定的

数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。

char (*fp)[3];实际上是声明了一个指向一维数组的指针。且这个一维指针包含3个char元素。那么fp本质上就是一个二维指针了

1.2 数组初始化

1.2.1 概述

注意下面几个典型错误:

<

好像int array4[5]={}并没有错,只会将数组各元素初始化为0

看下面的示例:

image-20240228135722010

则结果为:

image-20240228135844251

解释:全局数组和静态局部数组的默认值为0。int array1[5]={1,2,3}会将该数组的前三个值进行初始化,剩下的则会被默认初始化为0。array2arr2同理。而arr1是局部数组,且只初始化了一个值,但由于代码int arr1[5]={2}已经开启了arr1的初始化,因此其剩下没有显式指明的元素会被初始化为0。

1.2.2 字符数组的初始化

下面的三种方式都是可以的

char array[10]={"hello"};
char array[10]="hello";
char array[10]={'h','e','l','l','o','\0'};

记得要为\0单独分配一个空间

1.2.3 省略数组大小

只要数组一开始就被初始化了,那么其大小是可以省略不写的

例如:

int ar[5]={1,2,3,4,5};
int ar[]={1,2,3,4,5}; //是等价的

可以使用sizeof(array)/sizeof(Type)确定数组的元素个数

1.3 向函数传递数组

数组作为参数被传递到函数中时,实际上传递是数组的首地址。也就是说:数组在作为参数传递到函数中时,会自动退化为指针。这个时候,数组名就会被视为常量指针,指向数组首元素的地址(但是数组和指针本质上是两种不同的数据类型,不能完全划等号)。

原因:数组在内存中是一段连续的存储空间,而将整个数组拷贝到函数参数中可能会消耗大量的内存和时间。而编译器只要知道了数组的首地址,就可以对数组进行一系列操作。

但是函数接收数组时,其参数类型还是要写明是数组的。例如:int sum(int arr[],int len);

对于一维数组而言,不管是静态定义的还是动态定义的,参数写成指针是可以的。对于二维数组而言,假如是动态定义的,那么形参可以写成二级指针。假如是静态定义的,那么要写成int a[][col]或者int (*a)[col],也就是指向一维数组的指针。

1.4 二维数组

image-20240317154645714

也就是说:a[0]存储的是第一个一维行数组的首地址(a[0][0]的地址),a[1]存储的是第二个一维行数组的地址(a[1][0]的地址)。

对于a[1][1],会先去得到a[1]的地址,接着根据a[1][1]知道是要找第一行中下标为1的元素。因此首地址+下标*元素长度就得到a[1][1]的值

二维数组在内存中的存储还是线性的,如图:

image-20240228141940575

1.4.1 初始化

看例子:

image-20240228143521068

结果:

array1:

1, 2, 3

4 ,5 ,0

而array2:

1, 2, 0

4, 0, 0

解释:int array2[2][3]={{1,2},{4}}将array2的第一行初始化为1、2,剩下的则会被自动初始化为0,第二行同理。

array1的初始化方式相当于给出了数组的所有元素,各数组元素会依次被初始化,而其共有6个元素,因此第6个元素默认为0。

1.4.2 省略第一维大小

例子:

int a[][4]={1,2,3 4,5,6,7,8,9,10,11,12};
int a[3][4]={1,2,3 4,5,6,7,8,9,10,11,12};

第一个数组中,编译器会自动根据给定的数组元素计算出数组的行数为3。因此可以省略第一维大小

注意:

int arr[][4]={1,2,3,4,5,6,7,8,9,10,11};
//虽然11不能整除4,但是其最后一个元素值为0

int a[][4]={{1,2,3}{0},{4,5}};等价于int a[][4]={{1,2,3}{0,0,0},{4,5,0}};

1.4.3 二维数组的降维

二维数组在内存中的存储方式实际上和一维数组一致,而一维数组在做为参数传递时,实际上传递的是数组的首地址。因此,对于函数void func(int arr[],ing len),可以将二维数组的首地址传入,再使用一维数组的方式区访问数组元素。

注意:不能直接把二维数组的名字传进去,因为二维数组的名字实际上是一个指针,指针和地址是不同的。传入二维数组名后就只能按照二维数组的方式去访问元素。

例如下面这段程序:

image-20240228150816567

这句话没有懂

image-20240228150837238

2 总结

C++,犹如编程的交响乐, 在代码的海洋中奏响和谐的旋律。

它是创造者的笔,雕刻着无尽可能,

是思想的翅膀,让梦想飞翔的天空。

无拘无束,灵活多变。

C++,是程序员心中的宝藏,永不凋零的花朵。

渴望挑战C++的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多C++的奇迹吧。我们推出了引领趋势的💻C++专栏:《C++程序设计》阅读笔记,旨在深度探索C++的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

流行的API架构学习

几种流行的API架构风格图 SOAP&#xff08;Simple Object Access Protocol&#xff09; 优点&#xff1a;SOAP 是一种基于 XML 的通信协议&#xff0c;具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能&#xff0c;并支持复杂的消息交换模式。 缺点&#xf…

buu刷题(2)

[护网杯 2018]easy_tornado web buuctf [护网杯 2018]easy_tornado1_[护网杯 2018]easy_tornado 1-CSDN博客 render是渲染HTML页面用到的函数 这应该是一个模板注入漏洞 访问/fllllllllllllag&#xff0c;自动跳到了这个页面&#xff0c;可以看到 url 上有个msgError, 尝试将…

力扣 904.水果成篮

题目&#xff1a; 题目理解&#xff1a;fruits里的每个数字表示一种类型水果&#xff0c;相同数字表示同种类型水果。 class Solution {public int totalFruit(int[] fruits) {// 用HashMap来表示篮子&#xff0c;key表示水果类型&#xff0c;value表示多少颗树Map<Intege…

工厂车间系统|基于springboot的工厂车间管理系统设计与实现(附项目源码+论文)

基于springboot工厂车间管理的设计与实现 一、摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱…

R语言数据操纵:如何构建子集

目录 向量的子集 矩阵的子集 数据框的子集 列表的子集 如何处理缺失值 向量化操作 构建子集的基本方法&#xff1a; 1.使用[]提取一个或多个类型相同的元素 2.使用[[]]从列表或者数据框中提取元素 3.使用$按名字从列表或数据框中提取元素 向量的子集 比如有一个向量…

uniapp:小程序腾讯地图程序文件qqmap-wx-jssdk.js 文件一直找不到无法导入

先看问题&#xff1a; 在使用腾讯地图api时无法导入到qqmap-wx-jssdk.js文件 解决方法&#xff1a;1、打开qqmap-wx-jssdk.js最后一行 然后导入&#xff1a;这里是我的路径位置&#xff0c;可以根据自己的路径位置进行更改导入 最后在生命周期函数中输出&#xff1a; 运行效果…

mybatis流式游标查询-导出DB大数据量查询OOM问题

问题场景 Mysql数据处理类型分以下三种 com.mysql.cj.protocol.a.result.ResultsetRowsStatic&#xff1a;普通查询&#xff0c;将结果集一次性全部拉取到内存 com.mysql.cj.protocol.a.result.ResultsetRowsCursor&#xff1a;游标查询&#xff0c;将结果集分批拉取到内存&…

【Python基础教程】5. 数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

文本处理语言awk基本语法

文章目录 运算符流程控制函数封装 awk语言初步 AWK 是一种强大的文本处理和数据解析工具&#xff0c;它支持丰富的运算符和流程控制语句。运算符方面&#xff0c;AWK 提供了基本的算术运算符&#xff08;, -, *, /, %, ^, **&#xff09;和赋值运算符&#xff08;, -, *, /, %…

【QT+QGIS跨平台编译】056:【pdal_json_schema+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_json_schema介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_json_schema介绍 pdal_json_schema 是与 PDAL(Point Data Abstraction Library)相关的 JSON 模式文件。PDAL 是一个用于处理和分析点云数据的开源库。JSON 模式…

常见寻找 SQL 注入漏洞方法总结

一、借助推理进行测试 识别 SOL 注入漏洞有一种简单的规则:通过发送意外数据来触发异常。该规则包括如下含义: 1. 识别 Web 应用上所有的数据输入。 2. 了解哪种类型的请求会触发异常。 3. 检测服务器响应中的异常。 二、通过参数判断 假设你正在访问一个网站&#xff0c…

NoSQL之Redis配置

文章目录 NoSQL之Redis配置一、关系数据库和非关系数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库的区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同 5、总结5.1 关系型数据库5.2 非关系型数据库 二、Redi…

Spring-IoC 基于注解

基于xml方法见&#xff1a;http://t.csdnimg.cn/dir8j 注解是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理&#xff0c;简化 Spring的 XML配置。 格式&#xff1a;注解(属性1"属性值1",...) 可以加在类上…

大数据基础设施搭建 - Spark

文章目录 一、解压压缩包二、修改配置文件conf/spark-env.sh三、测试提交Spark任务四、Spark on Hive配置4.1 创建hive-site.xml&#xff08;spark/conf目录&#xff09;4.2 查看hive的hive-site.xml配置与3.1配置的是否一致4.3 测试SparkSQL4.3.1 启动SparkSQL客户端&#xff…

【JAVA】JAVA快速入门(长期维护)

下面是java的一些入门基础知识&#xff0c;有需要借鉴即可。 课程&#xff1a;B站黑马程序员&#xff0c;JAVA入门LINK 一、初识JAVA 1.java概述 概念&#xff1a;java是由sun公司研发&#xff0c;在2009年被oracle收购&#xff0c;祖师爷詹姆斯高斯林&#xff0c;是一种高级…

Copilot for Microsoft365使用心得

从去年3月份的发布到上周获得的体验名额&#xff0c;关注copilot已经超过了一年&#xff0c; 实际体验了一周觉得微软这款产品真的挺厉害的&#xff0c;至少在我认知里面确实可以减少很多的工作量&#xff0c;在此感谢陈老师公众号的体验卡的活动&#xff08;活动真实有效&…

101. 对称二叉树及同类题

101. 对称二叉树 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNo…

【青龙脚本】星抖

脚本出处:Huaji 功能:完成日常任务 每天运行1次即可 变量名:yuanshen_xddj 手机登录软件后&#xff0c;抓包&#xff0c;搜索Authorization里面的参数 注意:每天12小时都要进软件领取金块&#xff0c;超过12小时就会停止产出 参数设置都在脚本注释里&#xff0c;懂的都懂&a…

Redis从入门到精通(五)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

传输层 --- UDP

目录 1. 传输层是什么呢&#xff1f; 2. 再谈端口号 2.1. 端口号是什么 2.2. 协议号是什么 2.3. 认识知名端口号 2.4. 端口号的相关问题 2.4.1. 一个进程可以绑定多个端口号吗&#xff1f; 2.4.2. 一个端口号可以被多个进程绑定吗&#xff1f; 2.4.3. 为什么不使用P…