当前位置: 首页 > news >正文

05_C++数组

05_C++数组

5.1 概述

  • 数组(Array)是C++中一种用于存储多个相同类型数据的容器。
  • 它们在内存中是连续存储的,这使得访问数组元素非常高效。
  • 数组可以是一维、二维或多维的,具体取决于应用需求。

5.2 一维数组

5.2.1 定义和初始化

一维数组有三种常见的定义和初始化方式,见示例代码:

#include<iostream>usingnamespacestd;intmain(){// 方法一:定义时指定大小,未初始化intarr1[5];// 数组名的命名规范与变量名一致// 利用下标逐个赋值arr1[0]=1;// 注意:数组下标从0开始arr1[1]=2;arr1[2]=3;arr1[3]=4;arr1[4]=5;// 方法二:定义时指定大小并初始化// 如果{}中元素个数少于数组大小,剩余元素会被自动初始化为0intarr2[5]={1,2,3,4,5};// 方法三:定义时不指定大小,由初始化列表决定大小intarr3[]={10,20,30};// 输出数组元素for(inti=0;i<5;i++){cout<<"arr2["<<i<<"] = "<<arr2[i]<<endl;}for(inti=0;i<3;i++){cout<<"arr3["<<i<<"] = "<<arr3[i]<<endl;}system("pause");return0;}

5.2.2 一维数组的数组名

  • 数组名代表数组的首地址,可以通过数组名访问数组元素。
  • 数组名本质上是一个常量指针,不能被修改。
  • 可以统计整个数组在内存中所占的字节数,使用sizeof运算符。

示例代码:

#include<iostream>usingnamespacestd;intmain(){intarr[5]={1,2,3,4,5};// 输出数组名(首地址)cout<<"数组名(首地址): "<<arr<<endl;cout<<"第一个元素地址: "<<&arr[0]<<endl;cout<<"第二个元素地址: "<<&arr[1]<<endl;// 计算数组所占字节数cout<<"数组所占字节数: "<<sizeof(arr)<<" 字节"<<endl;cout<<"单个元素所占字节数: "<<sizeof(arr[0])<<" 字节"<<endl;cout<<"数组元素个数: "<<sizeof(arr)/sizeof(arr[0])<<endl;// 修改数组名(错误示例,编译会报错)// arr = arr + 1; // 错误,数组名是常量指针,不能修改system("pause");return0;}

一维数组练习1:
在一个数组中,存储5个整数,找出其中的最大值和最小值,并输出它们的值和位置。

一维数组练习2:
定义一个包含5个元素的数组,并将数组转置(即将数组的第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,以此类推)。输出转置后的数组。
如果数组为{1, 2, 3, 4, 5},转置后应为{5, 4, 3, 2, 1}。

5.2.3 冒泡排序

冒泡排序是一种简单的排序算法,通过重复遍历数组,比较相邻元素并交换它们的位置,直到整个数组有序。

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
  3. 重复以上的步骤,每次比较次数-1,直到不需要比较

示例代码:

#include<iostream>usingnamespacestd;intmain(){intarr[]={64,34,25,12,22,11,90};intn=sizeof(arr)/sizeof(arr[0]);// 冒泡排序for(inti=0;i<n-1;i++){for(intj=0;j<n-i-1;j++){if(arr[j]>arr[j+1]){// 交换inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}// 输出排序后的数组for(inti=0;i<n;i++){cout<<arr[i]<<" ";}cout<<endl;system("pause");return0;}

5.3 二维数组

二维数组就是在一维数组的基础上增加了一个维度,类似于一个表格,有行和列的概念。

5.3.1 定义和初始化

二维数组的定义和初始化方式如下:

#include<iostream>usingnamespacestd;intmain(){// 方法一:定义时指定行列大小,未初始化intarr1[3][4];// 3行4列// 利用下标逐个赋值arr1[0][0]=1;arr1[0][1]=2;arr1[0][2]=3;arr1[0][3]=4;// ...// 方法二:数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } };intarr2[2][3]={{1,2,3},{4,5,6}};// 方法三:数据类型 数组名[行数][列数] = { 数据1,数据2 ,数据3,数据4 };intarr3[2][3]={1,2,3,4,5,6};// 方法四:数组名[][列数] = { 数据1,数据2 ,数据3,数据4 };intarr4[][3]={1,2,3,4,5,6};// 输出二维数组元素for(inti=0;i<2;i++){for(intj=0;j<3;j++){cout<<arr2[i][j]<<" ";}cout<<endl;}system("pause");return0;}

5.3.2 二维数组的数组名

  • 二维数组名代表二维数组的首地址,可以通过数组名访问二维数组元素。
  • 二维数组名本质上是一个指向一维数组的常量指针,不能被修改。
  • 可以统计整个二维数组在内存中所占的字节数,使用sizeof运算符。

示例代码:

#include<iostream>usingnamespacestd;intmain(){intarr[2][3]={{1,2,3},{4,5,6}};// 输出二维数组名(首地址)cout<<"二维数组名(首地址): "<<arr<<endl;cout<<"第一行地址: "<<&arr[0]<<endl;cout<<"第二行地址: "<<&arr[1]<<endl;cout<<"第一个元素地址: "<<&arr[0][0]<<endl;cout<<"第二个元素地址: "<<&arr[0][1]<<endl;// 计算二维数组所占字节数cout<<"二维数组所占字节数: "<<sizeof(arr)<<" 字节"<<endl;cout<<"单个元素所占字节数: "<<sizeof(arr[0][0])<<" 字节"<<endl;cout<<"二维数组行数: "<<sizeof(arr)/sizeof(arr[0])<<endl;cout<<"二维数组列数: "<<sizeof(arr[0])/sizeof(arr[0][0])<<endl;cout<<"一行元素所占字节数: "<<sizeof(arr[0])<<" 字节"<<endl;// 修改二维数组名(错误示例,编译会报错)// arr = arr + 1; // 错误,二维数组名是常量指针,不能修改system("pause");return0;}

5.3.3 二维数组应用案例:矩阵相加

矩阵相加是指将两个具有相同维度的矩阵对应位置的元素相加,得到一个新的矩阵。
示例代码:

#include<iostream>usingnamespacestd;intmain(){constintROWS=2;constintCOLS=3;intmatrixA[ROWS][COLS]={{1,2,3},{4,5,6}};intmatrixB[ROWS][COLS]={{7,8,9},{10,11,12}};intresult[ROWS][COLS];// 矩阵相加for(inti=0;i<ROWS;i++){for(intj=0;j<COLS;j++){result[i][j]=matrixA[i][j]+matrixB[i][j];}}// 输出结果矩阵cout<<"结果矩阵:"<<endl;for(inti=0;i<ROWS;i++){for(intj=0;j<COLS;j++){cout<<result[i][j]<<" ";}cout<<endl;}system("pause");return0;}

二维数组练习:
考试成绩统计:定义一个二维数组来存储5个学生的3门课程成绩,计算每个学生的总成绩和平均成绩,并输出结果。

for(intj=0;j<COLS;j++){cout<<result[i][j]<<" ";}cout<<endl;}system("pause");return0;}

二维数组练习:
考试成绩统计:定义一个二维数组来存储5个学生的3门课程成绩,计算每个学生的总成绩和平均成绩,并输出结果。

http://www.cnnetsun.cn/news/3196054.html

相关文章:

  • 2026年了,还在优化页面不优化段落?你out了!
  • 15个实用的API测试工具,命令行与GUI
  • 在线教育平台|网络学习平台|在线培训系统系统源码在线学习教育平台|JavaWeb | vue|SpringBoot|前后端分离| 项目并附带万字文档(源码+数据库+万字详设文档+软件包)
  • 基于STM32单片机烟雾温度防盗报警 物联网云平台 火灾检测系统312(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 钢结构厂房各部位名称及代号
  • Nova视觉小说框架:程序员的高效Unity视觉小说开发解决方案
  • 如何使用Conda国内源安装虚拟环境(保姆级全平台教程)
  • Postman进阶指南:电商API测试自动化与持续集成实践
  • 0x03 RLPD 训练范式全解析
  • YOLOv8船舶检测实战:从算法原理到海事场景部署
  • 豆包、千问同步下线智能体!自建AI自动化工作流迁移指南
  • 英雄联盟Akari助手:终极免费开源游戏效率提升工具完整指南
  • 十七、在k8s中监控mysql
  • 视频号批量下载终极指南:3分钟搞定全网热门资源采集
  • Plone开发四条铁律:ZODB、Generic Setup、Volto Block与安全默认
  • Node.js SQLite数据库加密实战:SQLCipher集成与安全存储指南
  • 文件上传漏洞实战解析:从Webshell到服务器控制的攻防对抗
  • Java实现文件异或加密:轻量级本地配置文件保护方案
  • 2026年7月宁波小程序开发公司哪家好?定制开发推荐与排行参考
  • WeblogicScan工具详解:自动化检测WebLogic历史漏洞的原理与实践
  • MySQL 8.0 图书管理系统数据库设计:从 E-R 图到 10 张表的性能优化实践
  • LRFMC模型 Python 3.12 实战:5步完成航空公司客户价值聚类与雷达图可视化
  • 用友NC系统安全深度剖析:SQL注入、XXE与控制台绕过的组合攻击链与加固实战
  • 外文论文辅导平台哪家好?2026年主流服务对比与选择指南
  • AI 开源工具链复现:环境锁定比安装成功更重要
  • Python取模运算深度解析:从循环索引到负数余数的工程实践
  • Web自动化测试中验证码处理与Cookie管理的实战策略
  • ntpd vs chrony vs systemd-timesyncd:3 款 Linux 时间同步方案对比与选型指南
  • QQ空间 JS SDK 与 DOM 操作:从官方 API 到自动化脚本的 3 种实现路径解析
  • CentOS 7 SELinux 3种模式详解:从 enforcing 到 disabled 的 2 种切换路径