【C++】探索一维数组:从基础到深入剖析


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯1. 什么是一维数组?
    • 一维数组的特点:
    • 示例
  • 💯2. 一维数组的创建
    • 创建语法
    • 示例代码
      • 示例 1:创建整型数组
      • 示例 2:使用常量作为数组大小
      • 示例 3:其他类型数组
  • 💯3. 一维数组的初始化
    • 3.1 完全初始化
    • 3.2 部分初始化
    • 3.3 错误初始化
    • 注意:大小推断
  • 💯4. 数组元素的访问
    • 下标访问
      • 语法
    • 示例代码
    • 注意:数组越界
  • 💯5. 数组元素的打印
    • 示例代码
      • 方法 1:使用固定大小
      • 方法 2:使用 `sizeof` 动态获取大小
  • 💯6. 数组与 `sizeof` 运算符
    • 6.1 `sizeof` 的作用
      • 示例代码
      • 输出结果
    • 6.2 注意事项
  • 💯小结


在这里插入图片描述


💯前言

  • C++ 作为一门强大的编程语言,在系统开发、游戏开发和高性能计算中有着广泛的应用。数组是 C++ 中最基本的数据结构之一,通过它可以高效地存储和操作一组同类型的数据。在本篇文章中,我们将通过一维数组的概念、创建、初始化、访问、打印及与 sizeof 运算符的结合使用,来全面梳理数组的使用方法。同时,我们还会深入探讨数组的细节,并对数组的一些常见问题提出解决思路。
    C++ 参考手册
    在这里插入图片描述


💯1. 什么是一维数组?

一维数组是用于存储一组相同类型数据的集合,并且这些数据存储在连续的内存空间中。

一维数组的特点:

  1. 连续存储:数组的所有元素在内存中是连续排列的,因此可以通过下标快速访问每个元素。
  2. 相同类型:数组中的所有元素必须是相同的数据类型,例如整型、浮点型、字符型等。
  3. 固定大小:数组的大小在定义时必须确定,且在使用过程中无法动态改变。

示例

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

上述代码定义了一个大小为 5 的整型数组 arr,并初始化了 5 个元素。每个元素占用的内存空间由数据类型决定,例如 int 类型通常占用 4 字节。


💯2. 一维数组的创建

创建语法

在 C++ 中,声明一维数组的基本语法如下:

type arr_name[size];
  • type:数组中存储的数据类型,例如 intfloatchar 等。
  • arr_name:数组名称。
  • size:数组的大小(必须是常量)。

示例代码

示例 1:创建整型数组

int math[20];

该语句定义了一个大小为 20 的整型数组,可以用来存储 20 个学生的数学成绩。

示例 2:使用常量作为数组大小

const int N = 20;
int math[N];

通过 const 定义的常量 N 作为数组大小,不仅使代码更清晰,也便于后续修改。

示例 3:其他类型数组

char ch[8];     // 存储 8 个字符
float score[10]; // 存储 10 个浮点数

💯3. 一维数组的初始化

数组在创建时可以同时初始化其元素。初始化的方法是将数据放入大括号 {} 中,按顺序赋值给每个元素。

3.1 完全初始化

如果为数组的所有元素赋值,则称为完全初始化。

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

此代码为数组的每个元素指定了一个值,数组内容为 {1, 2, 3, 4, 5}

3.2 部分初始化

如果只初始化部分元素,则未初始化的元素会自动赋值为 0

int arr[6] = {1}; // 第一个元素为 1,其他元素为 0

此时数组内容为 {1, 0, 0, 0, 0, 0}

3.3 错误初始化

初始化的元素个数不能超过数组的大小。

int arr[3] = {1, 2, 3, 4}; // 错误:初始化元素个数超过数组大小

注意:大小推断

如果不指定数组大小,可以根据初始化值的个数自动推断数组大小。

int arr[] = {1, 2, 3}; // 数组大小为 3

💯4. 数组元素的访问

下标访问

数组提供了一个操作符 [],用于访问指定位置的元素。

语法

arr[index]
  • index 是数组下标,表示要访问的元素位置。
  • 下标从 0 开始,因此第 n 个元素的下标为 n-1

示例代码

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << arr[7]; // 输出第 8 个元素:8
cout << arr[3]; // 输出第 4 个元素:4

注意:数组越界

如果访问的下标超出范围(如负数或大于等于数组大小),会导致越界访问

int arr[5] = {1, 2, 3, 4, 5};
cout << arr[5]; // 错误:越界访问

C++ 不会在编译阶段报错,但运行时可能产生不可预期的结果,甚至程序崩溃。


💯5. 数组元素的打印

如果需要打印整个数组的内容,可以使用循环访问每个元素。

示例代码

方法 1:使用固定大小

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {cout << arr[i] << " ";
}

输出结果:

1 2 3 4 5 6 7 8 9 10

方法 2:使用 sizeof 动态获取大小

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {cout << arr[i] << " ";
}

此方法通过计算数组的大小动态确定循环范围,避免硬编码数组大小,提高代码的灵活性。


💯6. 数组与 sizeof 运算符

6.1 sizeof 的作用

  • sizeof(数组名):返回数组的总大小,单位是字节。
  • sizeof(数组名) / sizeof(第一个元素):计算数组的元素个数。

示例代码

#include <iostream>
using namespace std;int main() {int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << sizeof(arr) << endl;                 // 数组的总大小cout << sizeof(arr) / sizeof(arr[0]) << endl; // 数组的元素个数return 0;
}

输出结果

假设 int 类型占用 4 字节:

  1. sizeof(arr) 返回 40(总大小)。
  2. sizeof(arr) / sizeof(arr[0]) 返回 10(元素个数)。

6.2 注意事项

  • 当数组作为函数参数传递时,sizeof(数组名) 会退化为指针大小,无法正确返回数组的大小。
  • 示例:
void printSize(int arr[]) {cout << sizeof(arr) << endl; // 输出的是指针大小,而不是数组大小
}

💯小结

本文系统性地介绍了 C++ 一维数组的创建、初始化、访问、打印以及与 sizeof 运算符结合的应用。通过学习这些内容,您可以更灵活地使用数组处理数据。同时,我们也强调了数组越界和 sizeof 的局限性,帮助您在实际开发中避免潜在问题。

数组作为 C++ 基础知识的重要部分,是深入学习指针、动态内存分配和 STL 容器的基石。通过不断实践,您会更好地掌握其应用场景和特性,为编写高效可靠的代码奠定基础!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

学习C++是一段既充满挑战又令人收获颇丰的旅程。作为一门历史悠久且广泛应用的编程语言,C++不仅提供了强大的功能,还以其复杂性闻名。因此,在学习这门语言的过程中,我深刻体会到了它的深度和广度,同时也总结了一些心得,希望对未来的学习者有所帮助。

初识C++:从基础开始

在接触C++之前,我对编程的了解仅限于一些基础的概念,例如变量、循环和条件语句。C++的学习从这些最基本的部分开始,帮助我夯实了编程的基础。C++的语法严格,这在一开始可能会让人感到不适应,但也正是因为这种严格性,它迫使我养成了良好的编程习惯。例如,必须明确变量的类型,让我更注重程序的逻辑性和可读性。

掌握面向对象编程思想

C++最具特色的部分之一就是面向对象编程(OOP)。初次接触类和对象时,我对这种编程范式感到新奇而又困惑。OOP的核心思想是将现实世界中的事物抽象为类,通过类的实例化生成对象,从而以更直观的方式管理程序的复杂性。

我记得刚开始学习类时,写了一个关于"学生管理系统"的小程序。通过定义"学生"类,设置姓名、学号和成绩等属性,再为类添加一些方法,如打印信息和计算平均分,我逐渐理解了OOP的实际应用价值。这种封装、继承和多态的思想让我感受到C++的强大,也让我认识到软件设计中的灵活性。

理解指针与内存管理

如果说C++中有什么让我印象最深刻且花费最多时间去理解的内容,那一定是指针和内存管理。指针是C++的一大特色,同时也是许多初学者的难点。我在学习过程中经常因为指针的误用导致程序崩溃,甚至遇到一些难以调试的问题。

为了更好地理解指针,我专门阅读了一些资料,并亲手编写了许多练习程序。例如,我通过编写动态数组、链表和二叉树等数据结构,深刻体会到了指针在动态内存分配中的重要性。通过这些实践,我不仅掌握了指针的使用,还学会了如何使用newdelete进行内存管理,以及如何避免内存泄漏。

学习STL的便利性

C++的标准模板库(STL)是学习过程中的一个亮点。STL提供了许多现成的数据结构和算法,例如向量(vector)、队列(queue)、栈(stack)以及哈希表(unordered_map)等。在学习STL之前,我花了大量时间自己实现这些数据结构,而STL的出现大大简化了我的开发过程。

通过学习STL,我认识到了高效代码的重要性,也学会了如何快速解决问题。例如,在一次编程竞赛中,我需要快速实现一个排序功能,而STL中的sort函数帮助我节省了大量时间。与此同时,我还了解了STL背后的一些实现原理,例如迭代器的使用和时间复杂度的分析。

错误与调试:不可避免的成长

在学习C++的过程中,错误和调试是不可避免的。无论是编译错误还是运行时错误,几乎每次编写代码时都要面对各种各样的问题。这让我一开始感到沮丧,但随着经验的积累,我学会了如何分析错误信息并快速定位问题。

调试工具是我的好帮手。例如,使用gdb调试器让我能够逐行检查代码的执行过程,而现代的集成开发环境(IDE)如Visual Studio则提供了更直观的调试界面。此外,我还养成了在代码中添加日志和断点的习惯,这些技巧帮助我在处理复杂问题时更加得心应手。

提升编程效率的技巧

随着对C++的深入学习,我也总结了一些提升编程效率的技巧:

  1. 模块化编程:将代码分成多个文件,使得每个模块专注于完成特定的任务,从而提高代码的可读性和可维护性。
  2. 注重代码规范:遵循一致的命名规则和缩进风格,让代码更易于理解。
  3. 利用C++11/14/17的新特性:例如,auto关键字简化了变量类型的声明,智能指针(std::shared_ptrstd::unique_ptr)帮助更安全地管理内存。
  4. 多阅读优秀代码:通过阅读开源项目中的代码,我学到了很多实用的编程技巧和设计模式。

总结与展望

学习C++不仅让我掌握了一门编程语言,更让我养成了严谨的思维方式。在这个过程中,我学会了如何从问题中总结经验,如何不断优化自己的代码,以及如何以更高效的方式解决实际问题。

未来,我希望能够继续深入学习C++的高级特性,例如模板编程和多线程开发,同时也希望能够将C++应用于更多实际项目中,如游戏开发、嵌入式系统和高性能计算。我相信,通过不断的实践和学习,我将在C++的世界中发现更多的乐趣和可能性。

总之,C++是一门值得花时间深入学习的语言。尽管它的学习曲线较陡,但正是这种挑战让我更加热爱编程,也让我在每次克服困难后获得了巨大的成就感。

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

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

相关文章

为什么要用ZGC

一、为什么要用 ZGC 问题 我们有个“智慧园区”的项目,我们的下游系统“交叉带”[硬件系统]要求我们服务 60ms内返回结果&#xff0c;并且可用性要达到 99.99%。当时使用的是 G1垃圾回收器&#xff0c;单次 Young GC 40ms&#xff0c;一分钟10次&#xff0c;接口平均响应时间…

ffmpeg 编译+ libx264

编译 libx264 将 libx264 生成结果拷贝到 msys64 的 usr\local 目录下。这样在 msys2_shell 中就可以使用 /usr/local 来找到这个路径了。 编译不设置 prefix&#xff0c;默认将文件拷贝到 /usr/local 编译 ffmpeg libx264 配置 pkg-config&#xff0c;不然编译找不到 libx26…

联通 路由器 创维SK-WR9551X 联通华盛VS010 组mesh 和 锐捷X32 PRO 无缝漫游

前言 联通路由器&#xff1a;联通创维SK-WR9551X&#xff0c;联通华盛VS010组mesh&#xff0c;并与锐捷X32 PRO混合组网&#xff0c;开启无限漫游。 1、mesh ≠ 无缝漫游 mesh是实现路由器快速组网的一种方式&#xff0c;通过mesh组网后可以实现无缝漫游。 mesh组网的设备要…

015-spring-动态原理、AOP的xml和注解方式

强制使用cglib动态代理 spring-AOP的使用

Nginx代理本地exe服务http为https

Nginx代理本地exe服务http为https 下载NginxNginx命令exe服务http代理为https 下载Nginx 点击下载Nginx 下载好之后是一个压缩包&#xff0c;解压放到没有中文的路径下就可以了 Nginx命令 调出cmd窗口cd到安装路径 输入&#xff1a;nginx -v 查看版本 nginx -h&#xff…

Oracle ASM命令行工具asmcmd命令及其使用方法

asmcmd 是 Oracle ASM&#xff08;Automatic Storage Management&#xff09;的一个命令行工具&#xff0c;用于直接管理和操作 ASM 实例和磁盘组。以下是一些常用的 asmcmd 命令及其使用方法的简要说明&#xff1a; 一、基本命令 1.1、启动 asmcmd [gridracdb2:/home/grid]…

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网&#xff0c;并模拟Internet的典型Web服务过程。通过此次课程设计&#xff0c;可以进一步理解Internet的工作原理和协议过程&#xff0c;并提高综合知识的运用能力和分析能力。具体目标包括&#xff1a; &#xff08;1&#xff09;掌握网络拓扑的…

如何解决Eigen和CUDA版本不匹配引起的错误math_functions.hpp: No such file or directory

Apollo9针对RTX40的docker环境里的Eigen库版本是3.3.4&#xff0c;CUDA是11.8: 编译我们自己封装模型的某些component代码时没问题&#xff0c;编译一个封装occ模型的component代码时始终报错: In file included from /usr/include/eigen3/Eigen/Geometry:11:0, …

Cobalt Strike流量改造

1&#xff1a;证书设置 这里我们直接伪造成bilibili的 通过网页查看证书详情&#xff1a; 2&#xff1a;上线流量设定 这里还是比较简单的 请求路径 请求地址 这里可以依据实际情况改 比如这里直接cv 3&#xff1a;心跳流量 这里我设置的是bilibil对于内容的搜索 这里我们…

Oracle 回归分析函数使用

Oracle 回归分析函数使用 文章目录 Oracle 回归分析函数使用什么是 回归分析函数回归分析函数示例1. 分析 SAL 和 COMM 之间的回归关系2. 按部门分析 SAL 和 COMM 的关系3. 根据 SAL 预测 COMM4. 分析员工薪资与工作年限的关5. 按部门分析工作年限与薪资的关系6. 计算 REGR_AVG…

【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )

17个Apache SeaTunnel案例下载见附件&#xff01; 开发篇 1.Apache SeaTunnel——OLAP 引擎的数据动脉 1.1项目定位——EtLT 时代的新一代数据集成平台 1.2Apache SeaTunnel 核心功能 1.3Apache SeaTunnel 在 OLAP 场景下的应用 1.4WhaleTunnel 产品特性 2.教你从头到尾开发一…

集装箱的纸箱和塑料箱识别数据集,使用YOLO,COCO JSON,PASICAL VOC XML格式标注,识别准确率高达97.5%

集装箱的纸箱和塑料箱识别数据集&#xff0c;使用YOLO&#xff0c;COCO JSON&#xff0c;PASICAL VOC XML格式标注&#xff0c;识别准确率高达97.5% 数据集分割 训练组88&#xff05; 4605图片 有效集8% 438图片 测试集4% 219图片 预处理 自动定向&#x…

STM32 高级 物联网通讯之LoRa通讯

目录 LoRa通讯基础知识 常见的3种通讯协议 远距离高速率的传输协议 近距离高速率传输技术 近距离低功耗传输技术 低功耗广域网 采用授权频段技术 非授权频段 LoRa简介 LoRa的特点 远距离 低功耗 安全 标准化 地理定位 移动性 高性能 低成本 LoRa应用 LoRa组…

【数据可视化-10】国防科技大学录取分数线可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

基于单片机中药存放环境监测系统的实现

基于单片机中药存放环境监测系统的实现 项目开发背景 随着现代中药的广泛应用&#xff0c;中药材的存储环境对其质量有着至关重要的影响。温湿度、烟雾、火灾等环境因素&#xff0c;若不加以控制&#xff0c;将会导致中药材失效或变质。因此&#xff0c;设计一个基于单片机的…

深入解析 Redisson 分布式限流器 RRateLimiter 的原理与实现

文章目录 RRateLimiter 介绍代码实现Lua 脚本现实场景1. 初始化限流器2. 限流器应用场景&#xff08;客人申请游玩流程&#xff09; RRateLimiter 介绍 在分布式系统中&#xff0c;限流&#xff08;Rate Limiting&#xff09;是保障系统稳定性、避免过载的重要机制。Redisson 作…

【贪心算法】贪心算法七

贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f…

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx&#xff0c;使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器&#xff0c;以其高效处理大量并发连接的能力而闻名&#xff0c;这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;数据基础知识”活动&#xff0c;了解有关云环境和数据服务中核心数据库概念的基础知识。通过本次免费的介绍性活动&#xff0c;你将提升在关系数据、非关系数据、大数据和分析方面的技能。 活动时间&#xff1a;01 月 07 日…

4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传

一、引言 在当今社会&#xff0c;安全问题始终是人们关注的重中之重。无论是家庭、企业还是公共场所&#xff0c;都需要一套可靠的安全防护系统来保障人员和财产的安全。随着科技的飞速发展&#xff0c;4G 报警器应运而生&#xff0c;为安全防范领域带来了全新的解决方案。…