C++之数组

2023-11-18

3 数组

3.1 一维数组

概述:数组就是一个集合,里面存放了相同类型的数据元素。
特点:

  • 存放在一块连续的内存空间
  • 数组中每个元素都是相同的数据类型
  • 通过下标访问数组元素(数组的下标是从0开始的

3.1.1 一维数组定义方式

主要有三种:

  1. 数据类型 数组名[数组长度];
  2. 数据类型 数组名[数组长度]={值1,值2,…};
  3. 数据类型 数组名[]={值1,值2,…};

例1(数组的定义及遍历)
定义1

//定义1
int arr1[5];
//给数组赋值
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++) {
	arr1[i] = i;
}
//输出数组
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++) {
	cout << arr1[i] << endl;
}

sizeof返回的是字节数,这里数组的长度为数组的总字节数/单个元素类型的字节数

运行结果:
在这里插入图片描述

定义2

//定义2

int arr2[5] = { 1,2,3,4,5 };
//输出数组
for (int i = 0; i < sizeof(arr2) / sizeof(int); i++) {
	cout << arr2[i] << endl;
}
cout << "-------------------------------" << endl;

在初始化数据的时候,如果没有全部填完,会用0填补剩余数据

运行结果:
在这里插入图片描述

定义3

//定义3
int arr3[] = { 10,20,30,40,50 };
//输出
for (int i = 0; i < sizeof(arr3) / sizeof(int); i++) {
	cout << arr3[i] << endl;
}

必须要有初始长度

运行结果:
在这里插入图片描述

3.1.2 一维数组数组名

作用:

  • 可以统计整个数组在内存中的长度
  • 可以获取数组在内存中的首地址

在这里插入图片描述
例2(数组名用途)

  • 通过数组名统计整个数组占用内存大小
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整个数组占用内存空间为:" << sizeof(arr) << endl;
cout << "每个元素占用内存空间为:" << sizeof(int) << endl;
cout << "数组中元素个数为:" << sizeof(arr)/ sizeof(int) << endl;

运行结果:
在这里插入图片描述

  • 可以通过数组名查看数组首地址
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "数组首地址为:" << arr << endl;
//&为取址字符
cout << "数组第一个元素地址为:" << &arr[0] << endl;

运行结果:
在这里插入图片描述

数组名是常量,不可以进行赋值操作

例3(数组元素逆置)

int a[] = { 1,2,3,4,5,6,7};
cout << "数组逆置前为:" << endl;
for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
	cout << a[i] << " ";
}
cout << "\n数组逆置前后:" << endl;
int temp = 0;
int end = sizeof(a) / sizeof(int) - 1;
int length = sizeof(a) / sizeof(int);
for (int i = 0; i < length/2; i++) {
	temp = a[i];
	a[i] = a[end];
	a[end] = temp;
	end--;
}
//加强版for循环
for (int t : a) {
	cout << t << " ";
}

在这里插入图片描述

注意点:用到变量temp来替换元素;加强版for循环要掌握。

3.2 二维数组

3.2.1 二维数组定义方式

主要有四种:

  1. 数据类型 数组名[行数][列数];
  2. 数据类型 数组名[行数][列数]={ {数据1,数据2} , {数据3,数据4} };
  3. 数据类型 数组名[行数][列数]={ 数据1,数据2 , 数据3,数据4 };
  4. 数据类型 数组名[ ][列数]={ 数据1,数据2 , 数据3,数据4 };

建议:以上四种定义方式,利用第二种更加直观,提高代码的可读性

定义1

//1)数据类型 数组名[行数[列数];
//分配内存空间
int b1[2][3];
//赋值
b1[0][0] = 1;
b1[0][1] = 2;
b1[0][2] = 3;
b1[1][0] = 4;
b1[1][1] = 5;
b1[1][2] = 6;
//输出
for (int i = 0; i < 2; i++) {
	for (int j = 0; j < 3; j++) {
		cout << b1[i][j] << endl;
	}
}

运行结果:
在这里插入图片描述
定义2

//2)数据类型 数组名[行数[列数]={ {数据1,数据2} , {数据3,数据4} };
int b2[2][3] = {
		{1,2,3},
	    {4,5,6}
};
for (int i = 0; i < 2; i++) {
	for (int j = 0; j < 3; j++) {
		cout << b2[i][j] << endl;
	}
}

运行结果:
在这里插入图片描述
定义3

//3)数据类型 数组名[行数[列数]={ 数据1,数据2 , 数据3,数据4 };
int b3[2][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++) {
	for (int j = 0; j < 3; j++) {
		cout << b3[i][j] << endl;
	}
}

运行结果:
在这里插入图片描述
定义4

//4)数据类型 数组名[  ][列数]={ 数据1,数据2 , 数据3,数据4 };
int b4[][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++) {
	for (int j = 0; j < 3; j++) {
		cout << b4[i][j] << endl;
	}
}

运行结果:
在这里插入图片描述

3.2.2 二维数组数组名

作用:

  • 查看二维数组所占内存空间
  • 获取二维数组首地址

例4(二维数组名用途)

  • 查看二维数组所占内存空间
int b2[2][3] = {
	{1,2,3},
    {4,5,6}
};
cout << "二维数组占用空间为:" << sizeof(b2) << endl;
cout << "二维数组第一行占用内存为:" << sizeof(b2[0]) << endl;
cout << "二维数组第一个元素占用内存为:" << sizeof(b2[0][0]) << endl;
cout << "二维数组行数为:" << sizeof(b2) / sizeof(b2[0]) << endl;
cout << "二维数组列数为:" << sizeof(b2[0]) / sizeof(b2[0][0]) << endl;

运行结果:
在这里插入图片描述

  • 获取二维数组首地址
int b2[2][3] = {
	{1,2,3},
    {4,5,6}
};
cout << "二维数组首地址为:" << b2<<endl;
cout << "二维数组第一行首地址为:" << b2[0] << endl;
cout << "二维数组第二行首地址为:" << b2[1] << endl;
cout << "二维数组第一个元素首地址为:" << &b2[0][0] << endl;

运行结果:
在这里插入图片描述

为什么二维数组的首地址与第一行首地址一样呢,又或者是第一个元素首地址?
解答:
二维数组的地址就是它首元即第一个一维数组a[0]的地址,而一维数组a[0]的地址又是它的首元a[0][0]的地址。所以三者是相同的。

例5(数组综合应用)

题目描述:有三名同学(张三、李四、王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩。

姓名 语文 数学 英语
张三 100 98 95
李四 90 75 68
王五 66 78 98

代码实现:

//建立二维数组(初始化)
int scores[3][3];
string names[3] = { "张三","李四","王五" };
//赋三科分数
int a = 0;
int b = 0;
int c = 0;
//计数(下标)
int n = 0;
int m = 0;
//总分
int sum[3];
do {
	cout << "请分别输入"<<names[n]<<"的三科成绩:" << endl;
	cin >> a >> b >> c;
	sum[n] = a + b + c;
	scores[n][m++] = a;
	scores[n][m++] = b;
	scores[n][m] = c;
	m = 0;//置为0
	n++;
	cout<<endl;
} while (n < 3);
//输出
for (int i = 0; i < 3; i++) {
	cout << names[i]<< "的总成绩为" << sum[i] << endl;
}

运行结果:
在这里插入图片描述

下期讲一讲数组排序问题,这里的总成绩还可以进一步排序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之数组 的相关文章

随机推荐

  • IDEA 集成VisualVM Launcher JDK 监控程序插件

    IDEA 安装VisualVM Launcher 插件 1 打开setting 找到Plugins选项 安装VisualVM Launcher 插件 如果有就跳过这一步 检索 VisualVM Launcher 安装成功后 重新启动IDEA
  • 感知机与支持向量机

    感知机 追求最大程度正确划分 最小化错误 容易造成过拟合 SVM 追求大致正确分类的同时 最大化分类间隔 一定程度上避免过拟合 1 普通感知机不能产生最大间隔 而SVM可以 2 带margin的感知机可以通过两种手段实现 早停 加正则化项
  • shell 脚本关键字&符号

    shell概念 shell 既是一种解释型编程语言 也是一个这种编程语言的解释器的名字 shell是解释型语言 就是解释器会一条一条的翻译每一条语句并执行 对比之下 C语言是编译型语言 编译器把整个工程编译成可执行文件才能执行 在没有续行符
  • win10下Linux子系统(ubuntu)开启并配置(shell主题,设置中文环境,图形界面...)

    创作不易 如果以下内容对你有帮助 别忘了点一个赞 让更多的小伙伴能看到吧 一 开启win10子系统 Windows Subsystem for Linux WSL 1 启动开发者模式 设置 gt 更新和安全 gt 开发者选项 gt 开发人员
  • 自动化测试框架Testng相关

    1 Testng简介 Testng是一套开源测试框架 是从Junit继承而来 testng意为test next generation 2 Testng介绍 适合测试的原因 比Junit涵盖功能更全面的测试框架 Junit更适合隔离性比较强
  • VS2017打开自身项目提示项目不兼容问题解决

    几天前用VS2017建的控制台程序 今天打开弹出对话框 提示版本不兼容 这我就很纳闷 VS2010的项目你打不开就算了 怎么自己的也提示版本不兼容 这重新创建一个再导入太麻烦了 在试了多次无果 而且百度到的都牛头不对马嘴 用NOTEPAD
  • PLSQL Developer的详细安装步骤

    1 下载地址http www allroundautomations com 下载下来 得到 2 解压到当前文件夹 3 双击plsqldev1105 x64 exe 安装PLSQL Developer 开发工具 点击plsqlev1105
  • uboot分析之第一阶段

    1 初始化 关看门狗 初始化时钟 初始化SDRAM 2 把程序从Nand flash 拷贝到 SDAM 3 设置SP sp指向某块内存 因为要调用c函数 就要使用栈 4 c函数就是读出内核 启动内核 1 起始位置 2 跳转到reset 3
  • 2020年高教社建模国赛真题A题--炉温曲线

    2020年高教社杯全国大学生数学建模竞赛题目 请先阅读 全国大学生数学建模竞赛论文格式规范 A题 炉温曲线 在集成电路板等电子产品生产中 需要将安装有各种电子元件的印刷电路板放置在回焊炉中 通过加热 将电子元件自动焊接到电路板上 在这个生产
  • StandardScaler类中transform和fit_transform

    StandardScaler类中transform和fit transform方法里 fit transform X train 找出X train的均值和 标准差 并应用在X train上 对于X test 直接使用transform方法
  • 机器学习常用十大算法

    基本的机器学习算法 线性回归算法 Linear Regression 逻辑回归算法 Logistic Regression 朴素贝叶斯算法 Naive Bayes 最近邻居 k 近邻算法 K Nearest Neighbors KNN 支持
  • 中路对线发现正在攻防演练中投毒的红队大佬

    背景 2023年8月14日晚 墨菲安全实验室发布 首起针对国内金融企业的开源组件投毒攻击事件 NPM投毒事件分析文章 紧接着我们在8月17日监控到一个新的npm投毒组件包 hreport preview 该投毒组件用来下载木马文件的域名地址
  • 信息收集 (一)Google Hack & robots文件

    一 Google Hack 在渗透测试中 信息收集是尤为重要的一部分 甚至可以占到整个渗透的百分之六十至七十 可见掌握好信息收集的方法十分重要 那GoogleHacking作为常用且方便的信息收集搜索引擎工具 它是利用谷歌搜索强大 可以搜出
  • nvm的安装

    当项目启动时npm i报错时 提示版本问题时 是因为项目中使用node版本过低而本地node版本太高时 需要切换低版本node 此时需要安装nvm node版本控制器 来进行版本切换 1 首先必须卸载本地node js 在我的电脑搜索nod
  • Dubbo 接口异常处理逻辑

    API 接口中抛出的异常类型 有一系列的规则 代码在 ExceptionFilter 的 onResponse 中 1 如果是受检异常 非Runtime 就直接抛出 这是因为如果是受检异常 接口定义的 throws 中需要涵盖 调用端需要捕
  • SQL server 基本增删改查(带练习示例)

    目录 建表sql语句 需要自己插数据 一 增加数据 1 插入单条数据 2 插入多条数据 二 修改数据 1 修改单列 修改刘德华的密码为123456 2 修改多列 修改小红的性别为女 年龄为30 三 删除数据 1 删除用户编号为3的用户信息
  • Python基本数据类型(三)

    一 set的函数说明 集合 set 是一个无序不重复元素的序列 基本功能是进行成员关系测试和删除重复元素 可以使用大括号 或者 set 函数创建集合 注 创建一个空集合必须用set 而不是 因为 是用来创建一个空字典 在python中set
  • python Django web 框架 (二十)之ORM

    Django之模型层第一篇 单表操作 一 ORM简介 我们在使用Django框架开发web应用的过程中 不可避免地会涉及到数据的管理操作 如增 删 改 查 而一旦谈到数据的管理操作 就需要用到数据库管理软件 例如mysql oracle M
  • 拿什么拯救你? rm -r

    天雷滚滚 天雷滚滚 天雷滚滚 作为一个Linux程序员 你能碰到的最伤心的事情 莫过于 编译了一整天的工程 不小心被rm r掉了 错误的执行了rm r 把文件系统都删除了 在嵌入式板子和PC之间切换的时候 不小心删错了目标 不要说你没有遇到
  • C++之数组

    C 基础 3 数组 3 1 一维数组 3 1 1 一维数组定义方式 3 1 2 一维数组数组名 3 2 二维数组 3 2 1 二维数组定义方式 3 2 2 二维数组数组名 3 数组 3 1 一维数组 概述 数组就是一个集合 里面存放了相同类