【C语言从不挂科到高绩点】10-C语言中数组 01

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节课开始重点给大家讲讲C语言中的数组

本套课程将会从0基础讲解C语言核心技术,适合人群:

  1. 大学中开设了C语言课程的同学
  2. 想要专升本或者考研的同学
  3. 想要考计算机等级证书的同学
  4. 想要从事C/C++/嵌入式开发的同学

================点个关注吧================

=========================================

六、C 语言中的数组

6.1 数组的概述

之前定义的变量在内存中只开辟了一个空间,只能存放一个数据,如果存放多个数据的话,之前的写法就实现不了了,这个时候就需要用到数组。

int ary[4];

上面的代码中,会在内存中分配 4 个连续的 int 类型空间。共占用 4*4=16 个字节。针对这 4 个 int 类型的空间整体取了个名叫 ary。我们将这样连续的内存空间存储一组数据集合叫做数组。

数据集合的名称称为数组名。数据集合中包含的每一个数据叫做数组的元素。数组中包含的数据个数称为数组的长度

上面代码转换成图显示:

上面的数组中:ary 数组名,20、10、30、50 这些数据称为数组的元素。数组中存放 4 个元素,那么这个数组的长度就为 4.

需要注意的问题:

  1. 数组是多个类型相同元素组成的一个数据集合。相当于一次性定义了多个类型相同的变量,将其存储到了一片连续的内存空间
  2. 数组的类型:数组中元素的数据类型,如果数组的类型是 int 类型,那么就意味着这个数组中只能存放 int 类型的数据。
  3. 数组的元素:每个位置上存放的数据内容。
  4. 数组的长度:数组中元素的实际个数。
  5. 数组占用内存的大小:连续的内存占用的字节=数组的长度*数组元素类型占用的字节。
  6. 数组的下标:开辟出来的连续空间,每个整体空间都有一个编号,这个编号称为下标。可以根据下标去访问或者操作数组中的元素(下标从 0 开始)。

6.2 数组的定义

6.2.1 定义数组的格式

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

比如:

int ary[5];
  1. ary 是数组名,就是为数组开辟出的连续空间的名称。单独出现在表达式中代表的是数组首元素的地址
  2. [5] 代表着这片连续的空间共分为 5 个等份的格子,每个格子中存储的数据称为数组的元素。
  3. int 代表了每个元素的类型。可以是任意类型,也可以是组类型,也可以是数组。但是一旦确定好类型之后,数组中只能存放此种类型的数据。
  4. 数组在定义的时候可以直接进行初始化赋值,成为初始值。

6.2.2 定义数组的方式

  1. 定长数组:在定义的时候直接确定数组的个数
int arr[5];// 该数组拥有5个int类型连续内存空间
  1. 变长数组:在定义的时候,通过输入或者赋值去确定数组的长度
int n=5;
int ary[n];

windows 下,有的编译器不能使用这种变长的手段定义数组

  1. 柔性数组:在定义的时候,根据赋值列表判断空间大小并赋值
int a[] = {100,200,300,400};//  表示:在大括号中给了4个数据,那么数组的长度就为4

【演示案例】

#include <stdio.h>int main(){// 定义定长数组int arr[5];printf("arr占用的内存大小为:%ld\n", sizeof(arr));// 数组占用内存大小=元素类型空间大小*数组的长度printf("arr占用的内存大小为:%ld\n",sizeof(int)*5);// arr[0] 获取数组下标为0 的元素(首元素)printf("arr数组中元素占用的字节数:%ld\n",sizeof(arr[0]));printf("arr数组中元素类型的字节数:%ld\n",sizeof(int));// 定义变长数组int n=0;printf("请输入数组的长度:");scanf("%d",&n);int ary[n];// 使用变量n作为数组的长度printf("ary占用的内存大小为:%ld\n",sizeof(ary));// 定义柔性数组int a[] = {10,20,30,40,10,70,89,56,8};printf("a占用的内存大小为:%ld\n",sizeof(a));// 求数组的长度// 数组占用的总空间大小/每个元素占用的空间大小printf("数组的长度:%ld\n", (sizeof(a)/sizeof(int)));printf("数组的长度:%ld\n", (sizeof(a)/sizeof(a[0])));return 0;
}

6.2.3 数组的初始化方式

  1. 清空每个单元的存储,将所有的元素赋值为 0
int a[10] = {0};
double da[10] = {0};
char ca[10] = {0};

表示:将数组的 10 个元素,全部初始化为 0;

  1. 根据空间大小,准备合法的数据进行对位赋值。
int a[5] = {2,5,6,7,4};

  1. 根据空间的区间定位,然后选择某片空间进行连续赋值
int ba[100]={[0 ... 30]=10, [31 ... 60]=20, [61 ... 99]=30};

表示:数组的下标 0 到 30 的元素赋值为 10,下标为 31 到 60 的元素赋值为 20,下标为 61 到 99 的元素赋值为 30.

【演示案例】

#include <stdio.h>int main(){int a[5] = {0}; // 将所有的元素初始化为0int ary[5] = {50,80,70,20,10};// 下标 0到30设置为10  31到50初始化为20  51到99初始化为30int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};return 0;
}

6.3 数组的取值和遍历

6.3.1 获取数组元素的方式

数组名[下标];

假如:

int ary[5] = {10,30,20,80,60}

数组在内存中的存储,可以是如下的形式:

如上图所示:

// 获取数组指定位置上元素的方式: 数组名[下标];
ary[0]  // 将数组下标为0 的元素取出来
ary[2]  // 将数组下标为2 的元素取出来

【演示案例】

#include <stdio.h>int main(){int a[5] = {0}; // 将所有的元素初始化为0// 数组的下标(元素的位置)从0开始// 下标:      0  1  2  3  4int ary[5] = {50,80,70,20,10};// 下标 0到30设置为10  31到50初始化为20  51到99初始化为30int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};// 从数组中获取元素的格式: 数组名[下标]printf("ary[0]:%d\n",ary[0]);  // 获取数组中下标为0的元素printf("ary[1]:%d\n",ary[1]); // 获取数组中下标为1的元素printf("ary[2]:%d\n",ary[2]); // 获取数组中下标为2的元素printf("ary[3]:%d\n",ary[3]); // 获取数组中下标为3的元素printf("ary[4]:%d\n",ary[4]); // 获取数组中下标为4的元素return 0;
}

6.3.2 数组的遍历

数组的遍历:逐个访问从下标为 0 的数据到最后一个数据

// 下标:      0  1  2  3  4
int ary[5] = {50,80,70,20,10};

遍历数组的固定格式:

int 数组长度 = sizeof(数组名称)/sizeof(数组类型);
for(int i=0;i<数组长度;i++){// 获取数组中的数据数组名[i];// 将i看成数组的下标
}

【案例代码】

#include <stdio.h>int main(){int a[5] = {0}; // 将所有的元素初始化为0// 数组的下标(元素的位置)从0开始// 下标:      0  1  2  3  4  5int ary[7] = {50,80,70,20,10,30,90};// 下标 0到30设置为10  31到50初始化为20  51到99初始化为30int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};// 从数组中获取元素的格式: 数组名[下标]printf("ary[0]:%d\n",ary[0]);  // 获取数组中下标为0的元素printf("ary[1]:%d\n",ary[1]); // 获取数组中下标为1的元素printf("ary[2]:%d\n",ary[2]); // 获取数组中下标为2的元素printf("ary[3]:%d\n",ary[3]); // 获取数组中下标为3的元素printf("ary[4]:%d\n",ary[4]); // 获取数组中下标为4的元素// 数组的第一个元素:printf("ary[0]:%d\n", ary[0]);// 数组的最后一个元素: 直到数组有6个元素,长度为6printf("ary[5]:%d\n", ary[5]);// 很多情况下,我们在操作数组的时候,并不知道数组有多少个元素(数组的长度)// 此种情况可以算出数组长度// 数组长度=sizeof(数组名)/sizof(数组类型);// 数组长度=sizeof(数组名)/sizof(数组首元素);// int len = sizeof(ary)/sizeof(int);int len = sizeof(ary)/sizeof(ary[0]);// 数组最后一个元素的下标:len-1printf("ary最后一个元素:%d\n", ary[len-1]);printf("----------------------\n");// 数组的遍历:就是写个for循环,让i从下标从0开始到数组的最后一个元素的下标结束for(int i=0;i<=5;i++){  // i 可以从0 取到4printf("ary[%d]:%d\n",i,ary[i]); }printf("------------------------\n");// 数组遍历的固定格式:// 1. 计算出数组的长度:数组长度=sizeof(数组名)/sizof(数组类型);len =  sizeof(ary)/sizeof(int);// 2. 写一个for循环,让i作为数组的下标,从0到数组长度逐一递增for(int i=0;i<len;i++){// 3. 在for循环中根据i从数组中获取元素printf("ary[%d]:%d\n",i,ary[i]); }return 0;
}

练习:遍历如下 数组

int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};

6.3.3 修改或者设置数组元素的值

数组名[下标] = 值;

比如:

// 下标:      0  1  2  3  4  5
int ary[7] = {50,80,70,20,10,30,90};
//将 70 修改为666
ary[2] = 666;

【演示案例】

printf("---------------------------\n");
ary[2] = 666;// 将下标为2的元素设置为666
// 数组遍历的固定格式:
// 1. 计算出数组的长度:数组长度=sizeof(数组名)/sizof(数组类型);
len =  sizeof(ary)/sizeof(int);
// 2. 写一个for循环,让i作为数组的下标,从0到数组长度逐一递增
for(int i=0;i<len;i++){// 3. 在for循环中根据i从数组中获取元素printf("ary[%d]:%d\n",i,ary[i]); 
}

6.3.4 数组练习-成绩管理

设班上有 5 个学生,分别给 5 个学生录入成绩

  1. 求出班级的总分
  2. 求出班级的平均分
  3. 求出班级的最高分和最低分

【参考代码】

/**
设班上有 5 个学生,分别给 5 个学生录入成绩
1. 求出班级的总分
2. 求出班级的平均分
3. 求出班级的最高分和最低分
**/#include <stdio.h>int main(){int num = 0;// 输入班级的人数printf("请输入班级的人数:");scanf("%d",&num);// 定义数组,用来存放所有学生的成绩//float ssx[5] = {0} ;float scores[num] ;float sum = 0;// 总分for (int i = 0; i < num; ++i){printf("请输入第%d位同学的成绩:\n",(i+1));// float sc = 0;// scanf("%f",&sc);// scores[i] = sc; // 将输入的分数存入到数组中// 直接向数组中录入数据// 第一次循环:&score[0]  将录入的数据,存入首元素所对应的空间// 第二次循环:&score[1] 将录入的数据,存入到下标为1的所对应的空间scanf("%f",&scores[i]); // 每录入一个成绩,就将成绩累加到sum总分中sum += scores[i]; // 将录入的成绩取出来,累加到总分中}printf("班级的总分为%.1f,平均分为:%.1f\n",sum ,sum/num);// 假设第一个学生的成绩是最高分float max = scores[0];// 假设第一个学生的成绩是最低分float min = scores[0];// 遍历数组,和这个假设的最高分做比较for(int i=0;i<num;i++){// 如果当前的分数大于假设的最高分if(max<scores[i]){ //说明假设错误// 重新假设当前的分数为最高分max = scores[i];}if(min>scores[i]){min = scores[i];}}printf("班级的最高分为:%f\n", max);printf("班级的最低分为:%f\n", min);return 0;
}

 ----------------------------------------------------------------------

分享不易,耗时耗力,喜欢的同学给个关注和赞吧

承接毕设指导,技术答疑,学习路上想要找私人教练的同学可以私信我

更多学习资料,公众号:墨轩学习网,B站:墨轩大楼

----------------------------------------------------------------------

另有下图需求的也记得私信我哟,专业班子

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

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

相关文章

苹果手机显示“连接iTunes”是什么意思?

在日常使用苹果手机的过程中&#xff0c;有时我们可能会遇到屏幕突然显示“连接iTunes”的提示&#xff0c;这让不少用户感到困惑和不安。今天&#xff0c;我们就来深度解析一下这个提示的含义&#xff0c;并为大家提供详细的解决方案。 一、显示“连接iTunes”的含义 当苹果…

CasaOS系统本地安装Gopeed高速下载软件并实现异地远程访问下载文件

文章目录 前言1. 更新应用中心2.Gopeed安装与配置3. 本地下载测试4. 安装内网穿透工具5. 配置公网地址6. 配置固定公网地址 前言 本文主要介绍如何在轻NAS系统CasaOS小主机中安装支持全平台的高速下载器Gopeed&#xff0c;并结合内网穿透工具配置公网地址实现远程访问本地主机…

Nginx部署前端vue项目操作步骤和方法~小皮

部署前端Vue.js项目到Nginx上&#xff0c;是开发流程中至关重要的一步&#xff0c;它意味着将静态文件托管在Web服务器上&#xff0c;使应用程序能够被用户访问和交互。下面将详细介绍如何使用Nginx部署前端Vue项目的操作步骤和方法&#xff1a; 准备构建Vue项目 安装Node.js和…

在BrowserStack上进行自动化爬虫测试的终极指南

一、背景介绍 随着互联网的快速发展&#xff0c;数据变得越来越宝贵&#xff0c;爬虫技术已成为从网页中提取信息的重要工具。然而&#xff0c;在不同的环境中测试和运行爬虫脚本可能会带来挑战。尤其是在多浏览器、多平台的环境中确保爬虫的稳定性和兼容性是一个令人头疼的问…

HTTP 之 消息结构(二十二)

HTTP&#xff08;超文本传输协议&#xff09;是一种用于传输超媒体文档的协议&#xff0c;它定义了客户端和服务器之间请求和响应的消息结构。HTTP消息由一系列标准头部字段、一个空行和可选的消息体组成。 客户端请求消息 请求消息包括以下格式&#xff1a;请求行&#xff08;…

Flask_admin—快速搭建访客登记系统Web管理后台

简介&#xff1a;在《App Inventor 2—自制身份证识别及人证比对验证系统》和《MySQL—访客登记系统数据库及Web服务搭建》的基础上&#xff0c;通过在云服务器上的Python程序中使用Flask_admin扩展&#xff0c;快速搭建数据库Web管理后台。通过整合上述实验&#xff0c;了解全…

希尔排序的图解展示与实现

什么是希尔排序 对整个数组进行预排序&#xff0c;即分组排序&#xff1a;按间距为gap分为一组&#xff0c;分组进行插入排序。 预排序的作用与特点 大的数更快地到后面&#xff0c;小的数更快地到前面&#xff1b; gap越大&#xff0c;跳得越快&#xff0c;排完接近有序慢&…

电脑浏览器显示代理服务器拒绝连接的解决办法

问题&#xff1a; 打开电脑浏览器显示代理服务器拒绝连接 解决办法&#xff1a; 1、按住winq键&#xff0c;输入代理&#xff0c;出现更改代理设置 2、将下面的自动检测设置、使用设置脚本、使用代理服务器都设置为关闭&#xff0c;刷新网页即可

人工智能 | 大语言模型应用框架介绍

简介 大语言模型的英文全称为&#xff1a;Large Language Model&#xff0c;缩写为 LLM&#xff0c;也被称为大型语言模型&#xff0c;主要指的是在大规模文本语料上训练、包含百亿级别参数的语言模型&#xff0c;它用来做自然语言相关任务的深度学习模型。 自然语言的相关任…

【数学建模国赛赛前必看】参赛作品及MD5码提交流程

国赛参赛人数非常多&#xff0c;导致了很多时候我们没有办法正常的去上传论文&#xff0c;所以国赛就会有一个MD5码的上传过程&#xff0c;MD5码上传在国赛比赛当中是非常重要的。每年几乎都有5%左右的队伍会因为MD5码上传失败导致最终的论文交稿失败。所以我们今天具体的讲一下…

qt对象析构顺序记录

说明qt对象树 对象析构顺序为&#xff1a; 本对象的析构函数栈成员对象树中自己的孩子们对象树中自己的孙子们 所以&#xff0c;千万别在孩子对象中&#xff08;qt对象树特有的这个连带析构关系&#xff09;去访问父对象的任何栈成员&#xff08;包括堆成员&#xff09;的信息…

大模型产品经理学习路线,2024最新,从零基础入门到精通,非常详细收藏我这一篇

随着人工智能技术的发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的兴起&#xff0c;越来越多的企业开始重视这一领域的投入。作为大模型产品经理&#xff0c;你需要具备一系列跨学科的知识和技能&#xff0c;以便有效地推动产品的开发、优化和市场化。以下…

Unity | 内存优化之资源冗余问题

目录 一、资源冗余 1.主动打包和被动打包 2.依赖资源处理 &#xff08;1&#xff09;分别制作AB包&#xff0c;会造成冗余 &#xff08;2&#xff09;资源冗余解决办法&#xff1a; &#xff08;2.1&#xff09;先主动打依赖资源AB包 &#xff08;2.2&#xff09;将两个…

智能分拣投递机器人

产品介绍 自研智能分拣投递机器人&#xff0c;专注于物流行业“NC小件”的分拣与投递&#xff0c;机器人运行稳定、分拣效率高&#xff0c;搭配智能分拣投递系统单台机器人最大作业效率可达400件/H&#xff0c;投递效率相较于传统“小黄人“提升了30%-50%&#xff0c;可替代“…

机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]

机器学习之监督学习&#xff08;一&#xff09;线性回归、多项式回归、算法优化 1.监督学习定义2.监督学习分类2.1回归 regression2.2 分类 classification 3.线性回归 linear regression3.1 单特征线性回归模块一&#xff1a;梯度下降 3.2 多特征线性回归模块二&#xff1a;正…

代码审计总结

代码审计总结 概述 一、代码审计 1.1什么是代码审计&#xff1f; 1.2为什么要执行代码审核&#xff1f; 1.3代码审计的好处 二、代码审计流程 2.1代码检查方法 2.2代码检查项目 2.3编码规范 2.4代码检查规范 2.5缺陷检查表 2.6代码审计复查 2.7代码审计结果总结 三…

Qt25模型-QAbstractTableModel

模型-QAbstractTableModel 知识点modelexmodelex.hmodelex.cpp main.cpp运行图 知识点 //虚函数声明virtual int rowCount(const QModelIndex& parent QModelIndex())const;virtual int columnCount(const QModelIndex& parent QModelIndex())const;QVariant data(cons…

linux之网络子系统-MAC帧、数据报、段 的头部信息

一、MAC帧 格式 MAC帧是属于链路层&#xff0c;网卡发送数据的格式。 MAC帧主要有两种格式&#xff0c;一种是以太网V2标准&#xff0c;一种是IEEE 802.3&#xff0c;常用的是前者。 DMAC&#xff08;Destination MAC&#xff09;是目的MAC地址。DMAC字段长度为6个字节&#…

代码随想录算法训练营_day34

题目信息 62. 不同路径 题目链接: https://leetcode.cn/problems/unique-paths/description/题目描述: 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角…

STM32G474之TIM1更新中断

STM32G474之TIM1能产生如下的中断&#xff1a; 1、捕获比较1个事件&#xff08;Capture compare 1 event&#xff09; 用来获取“捕获输入脉冲的时间”&#xff0c;其次用来输出“比较输出波形”&#xff1b; 2、捕获比较2个事件&#xff08;Capture compare 2 event&#x…