C语言基础——数组

 {\▁/}

 ( / 。\ )

   / ⊃💔\⊃

为什么我那么努力还是得不到那么多赞

011de83bf98740aeade76f216f535e86.gif

          ʕ • ᴥ • ʔ         

 づ♡ど

 🎉 欢迎点赞支持🎉

个人主页:励志不掉头发的内向程序员;

专栏主页:C语言基础;


文章目录

前言

一、数组的概念

二、一维数组的创建及初始化

2.1 一维数组的创建

另:监视功能

2.2 一维数组的初始化

2.3 数组的类型

三、一维数组的使用

3.1 一维数组的下标

3.2 一维数组的打印

3.3 一维数组的输入

四、一维数组的内存存储

五、sizeof计算数组元素个数

总结


前言

大家好啊,我们这一章节就来讲讲数组吧,在之前的几个章节我们已经基本上解释了什么是数组(具体可以看我之前的文章:C语言基础——字符串与数组及部分操作符-CSDN博客),这里再简单说明一下吧。我们都知道,如果我们在C语言中想要创建很多个变量,如果是一个一个创建的话那效率太低下了,这个时候或许会有人想到用循环来搞定,但是我们再细想想,如果用循环来表示的话我们应该把这组数据储存在哪里呢,如果只是创建一个变量的话那么后一次循环会覆盖掉前一次循环,但是如果创建很多个变量的话又不好在循环之中插入,这个时候我们便可以使用我们心心念念的数组啦。我们这一章节就来具体看看数组到底是什么吧。


一、数组的概念

数组顾名思义就是存储一组数据的。它是一组相同类型的元素的集合,也就是说数组里的数据肯定是1个及以上,不能等于0;而且数组里的数据肯定都是相同类型的;数组有很多维度,我们这一章先来说说一维数组,二维及以上的我们下一章节再说,我们接下来一起来细看看吧。

二、一维数组的创建及初始化

2.1 一维数组的创建

type arr_name[常量值]

以上是以为数组的基本创建方法:

1. type是类型,也就是变量的类型,可以是像int、char、float、short等内置类型,也可以是自定义类型;

2. arr_name是你想取的数组名,最好起的有点意义,不然到时候看不懂就糟糕了;

3. [这个里面是数组的大小],[]里面一定得是常量,变量是会报错的,而且建议要多少就拿多少,不要浪费。

例如:int iloveyou[10]就是一个存储大小为10整型变量的数组。当然还可以创建其他类型的数组。

char ch [20];     //字符类型数组

double db[20];  //浮点数类型数组

存放数组时我们把存放在数组里的值称之为数组的元素,我们在创建数组时可以指定数组的大小和元素的类型。

9db045e0d084462e92a86bf1cba51138.png

另:监视功能

在继续讲之前我先来和大家说一下vs里面有里面的一个很有用的小功能——监视功能,这个功能可以看到我们的代码运行的方式,我们可以看到我们创建的值有没有按照我们应该的方式去运行,我们一起来看看吧。

首先如果说我们不知道程序有没有问题或者说我们按了ctrl+F5运行成功了却并没有按照我们想要的方式去走怎么办呢?我们可以按F10去一步一步的运行代码去看到底哪里有问题

int main()
{int a = 10;printf("%d", a);return 0;
}

就假如我这个代码有问题,能运行但是却不是我想要的结果,我就可以先按F10来一步一步的调试,但是我又看不到它内部的赋值之类的运行方式怎么办呢,我们就可以用监视功能。

cbb949c8c523438e88d0bc49709dd7df.png

按了F10以后会跳出这个操作台以及箭头,这个就是程序定格在这里等待着下一步,这个时候再按F10程序就会再往下走一行,直至走完,但这上面没有显示监视功能,我们可以这样打开它,cf7880844a7a458f9ed95552ee1f1b7c.png

这四个窗口都可以,看你喜欢

7e10f327350d486a9c2b4bc321ede01e.png

然后就出现了,这个时候我们就可以添加我们要监视的内容,比如说我这里觉得a有问题,我要输出的是20,但是为什么是10,我就可以去看看a是怎么变化的

0ae5779ceef54e64b9723c00ff91fcf3.png

我们在添加监视的项那里去添加a,然后再去一步一步的运行程序,直到程序运行完

7f8c3ab24bc3422caf61575190f79014.png

这里看到了当箭头在第九行时,也就是运行完了第八行时a变成了10,原来是第八行有问题啊,这就是监视的用法。下面初始化的时候再给大家展示展示。

2.2 一维数组的初始化

我们在使用数组的时候,一般都是要在里面赋予一些我们需要的值的,这个时候就要用到我们的数组初始化了,一般数组的初始化都是用{},在{}里面输入我们想要的值。

int arr[5] = { 1, 2, 3, 4, 5 };     // 完全初始化

int arr[5] = { 1 };                     // 不完全初始化

int arr[3] = { 1, 2, 3, 4 };         //错误初始化

初始化一般会有以上的三种情况,首先就是完全初始化,就是说我们要的元素每个都把它初始化了,这就是完全初始化;其次就是不完全初始化,就是没有把我们要的每个元素都初始化,而是初始化一部分,那除了我们初始化的那一部分,其余的没有初始化的部分计算机默认为0;然后就是错误的初始化,就是我们要的元素还没有我们初始化的元素多,所以会出错,我们要多少就初始化多少,不能贪心多初始化哦。

ce6776dae1e245688f4238196ae4216f.png

我们可以看到不完全初始化在未被初始化的部分默认为0。

2.3 数组的类型

小伙伴们可能会想,我们创建的东西一般都是会有一些类型的,那数组的类型是什么呢?

int arr1[10] = { 0 };

int arr2[5] = { 0 };

char ch[5] = { 0 };

以上三个数组的类型分别是什么呢?有的小伙伴们可能会认为像数组名前面的就是数组类型,但实际上是错误的哦,数组名前面的是数组里的元素类型,而不是数组类型,我们思考一下我们原来是这么定义变量的,是不是除了变量名剩下的就是变量类型,其实数组也是如此,以下就是以上3种的数组类型。

int [10];

int [5];

char [5];

就是把数组名删除后剩下的部分,或许有同学还很疑惑,为什么是这样的呢?别急,这里面涉及到指针,我们以后再说明。我们可以看到,数组类型是十分多变的,所以它属于自定义类型变量而不是内置类型。

三、一维数组的使用

以上我们了解到了数组的一些基本语法,接下来我们就来看看数组该如何使用吧。

3.1 一维数组的下标

在C语言当中,数组是有下标的,下标是从0开始的,假如有n个元素,那么下标的末尾就是n-1,下标相当于一个编号,可以用来查找我们指定位置的数组里数据内容。

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

我们可以知道它们其实是这样

a34ef6aa2ddf47df859ee71359f6e822.png

它的下标一定是从0开始的,到n-1,我们可以通过下标来找到我们需要的数据,比如想要找到5,那就找下标是4的数据就可以了。

3.2 一维数组的打印

我们知道,数组之中有这么多数据,我们该证明打印出来呢?这里我们要介绍一个操作符" [ ] ",这个操作符叫做下标引用操作符,它可以引用我们所需要的下标里的数据的内容

int main()
{int arr[5] = { 1, 2, 3, 4, 5 };printf("%d", arr[3]);return 0;
}

这个代码我们就可以打印下标是3,变量名叫做arr的数组的内容,也就是4。

1aa9bbdac34549da8d32fe4d555c8910.png

但是如果我们想都打印出来该怎么做呢,我们之前说过,像这种批量化的操作一般都可以用循环来操作,我们这里也一样,可以试试循环。

int main()
{int arr[5] = { 1, 2, 3, 4, 5 };for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;
}

 由于下标是从0开始,到n-1就是最后一个,所以我们像这样写就可以把数组都输出出来啦。

d06eada9d26d4738b7c8a294f7f5ec90.png

这就是数组的输出方式啦,主要是靠循环来把数组一个一个的输出出来。

3.3 一维数组的输入

一维数组的输入和输出的方式其实大相径庭,也是靠循环来输出

int main()
{int arr[5] = { 0 };for (int i = 0; i < 5; i++){scanf("%d", &arr[i]);}for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;
}

 我们可以看到,这是一个先输入然后再输出的程序,输入本质上也就是一个一个的输入,靠循环来实现的。

9a933fb1e16c43049e544f78dfad7dd8.png

四、一维数组的内存存储

我们知道数组在我们的物理模型是长这样的

9db045e0d084462e92a86bf1cba51138.png

创建一个变量肯定是要在计算机中开辟一个内存空间的,我们数组在创建时它的内存空间是不是也向上图一样是连续的呢,还是说它是断开的呢,我们可以来看看,但是在看之前我要和大家讲一下一些概念,首先,在C语言中%p是专门用来打印地址的;还有一个&操作符,这个是专门用来取地址的,&arr就是取用地址arr;还有就是一般地址是以16进制打印出来,也就是16进1,10用a表示然后以此类推,到15用f表示。同时我们如果使用x64(64位环境)它的地址会比较长,所以这里就使用x86(32位环境)来打印代码。

5fa787c285ef49bda7af10abb0bf6213.png

int main()
{int arr[10] = { 0 };for (int i = 0; i < 10; i++){printf("%p\n", &arr[i]);}return 0;
}

运行这个代码来看看它们的内存是如何存储的吧。

e92186062e4046078a894893e1a15bfd.png

我们可以看到,它们每个地址之间都隔了4个字节(内存的单位是字节,之前讲过哦),难道说它们之间不连续嘛,我们不要忘记啦,这个数组类型所存储的元素都是int整型,int型元素本身是占4个字节的,所以说它在内存中的物理模型如下。

f9ea4a7978534cb6bd7555b778a0c959.png

很显然,一维数组在内存中应该是连续存放的,这对我们后期学指针时有大用,请牢牢记好。

五、sizeof计算数组元素个数

我不知道小伙伴们有没有想过,难道每次输出或者输入时都要去看看到底要输入或者输出多少个元素吗,难道没有一种方法可以自动计算元素的个数,这样就可以直接修改数组而不用去修改其他数据了。当然有,这就是我们之前讲到过的sizeof函数。

我们之前讲sizeof函数,我们都知道sizeof函数的作用是用来计算变量的内存大小,但是这个怎么计算数组元素大小呢?我们知道,数组中的元素类型都是相同的,而且数组类型变量的内存大小是这些数组元素总的内存大小之和,也就是说,我们其实可以用总的元素之和除以一个元素的大小,就可以计算出一个数组中有多少个元素了

元素个数 = sizeof( arr ) / sizeof( arr[ 0 ] );

int main()
{int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };int sz = sizeof(arr) / sizeof(arr[0]);printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr[0]));printf("%d\n", sz);return 0;
}

这里我们可以看一下

ae47bdf69f694fb1a0b17a0eae36f6b7.png

可以看出来,成功的计算出了数组之中元素的个数,如果这个时候如果要更改数组后输入或者输出就十分方便了

int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

 如果更改数组,就只用直接更改,其他的都不用变。

int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 6, 8 };int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

ac56a0270f6f45b6b35dc867f8d62ec7.png

63557d3eb8d94080af4d0d4272befac3.png


总结

本章节讲述了一维数组的基本语法以及如何输入和打印,内容还是比较多的,下一章节我们将会在一维数组的基础上延申出二维数组及以上的内容,感谢小伙伴们的阅读,如果有那里写的不是很对,欢迎指出,谢谢大家。

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

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

相关文章

Java入门-java的集合框架

集合概念 集合&#xff0c;有时也称作容器(Container), 是对象的持有者&#xff0c;它们可以有助于高效访问的方式存储的组织对象。以生活中的案例为例&#xff1a; 集合就像装衣服的柜子&#xff0c;衣服就是集合中的元素。 集合框架图 Collection中每次操作的都是一个对象&a…

大事件项目实战

初始化 创建项目 新建api_server文件夹为项目根目录&#xff0c;并在项目中运行如下的命令&#xff0c;初始化管理配置文件&#xff1a; npm init -y 运行如下的命令&#xff0c;安装特定版本的express: npm i express4.17.1 在项目根目录中新建app.js作为整个项目的入口…

产品经理-交互说明撰写(八)

1. 交互说明 交互说明可以看做是交互设计师或者产品经理输出的最核心的”产品“交互说明面向的”用户“是下游的同事 ⇒ UI设计师、开发工程师、测试工程师 2. 基本交互形式 2.1 页面交互 2.2 元素控件交互 3. 交互说明主要包括以下3个维度 3.1 页面流程&#xff08;页面之…

医学图像分割--U-net变种

参考&#xff1a;医学图像分割综述:U-Net系列_医学图像 实例分割-CSDN博客 2D Unet 收缩路径&#xff1a;每个块包含两个连续的3 3卷积&#xff0c;后面是一个ReLU激活函数和最大池化层&#xff08;下采样&#xff09;扩展路径&#xff1a;该路径包括一个2 2转置卷积层(上采…

推荐丨免费一年期SSL证书在哪里可以申请到?

当然&#xff0c;申请HTTPS证书的流程可以简化为三个主要步骤&#xff0c;以便理解&#xff1a; 第一步&#xff1a;选择证书类型和认证机构 1. 确定证书类型&#xff1a;首先&#xff0c;你需要确定适合你网站的SSL证书类型。常见的有三种&#xff1a; - 域名验证型&#xff0…

什么是HTTP代理?适用于哪些场景?

HTTP代理是一种网络代理服务器&#xff0c;它主要用于处理HTTP协议的请求和响应。HTTP代理充当客户端&#xff08;如浏览器&#xff09;和目标服务器之间的中介&#xff0c;允许客户端通过代理服务器来发送HTTP请求&#xff0c;并接收来自服务器的响应。HTTP代理可以分为正向代…

时空AI软件:地理信息与遥感领域的智慧引擎

在地理信息与遥感技术的广阔疆域&#xff0c;时空AI软件如同一颗璀璨新星&#xff0c;将时空信息与智能深度融合&#xff0c;驱动着地理信息分析、决策支持、环境监测、城市规划等领域的深刻变革。本文将深入剖析其技术核心、应用实例、未来趋势&#xff0c;探索时空AI软件如何…

自适应容积卡尔曼滤波|(自适应CKF)的MATLAB源代码

介绍 容积卡尔曼滤波在理论上拥有比UKF更高的精度和稳定性&#xff0c;本自适应算法通过对观测残差的计算&#xff0c;在观测协方差R不准确或无法获得时&#xff0c;对R进行调节&#xff0c;以起到降低估计误差的作用。 模型 使用的是三维的非线性模型&#xff0c;经过适当修…

2024年蓝桥杯B组C++——复盘

1、握手问题 知识点&#xff1a;模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手&#xff0c;仅需要两两握手&#xff0c;也就是从42个握手开始&#xff0c;而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结&#xff1a…

数据集004:跌倒检测数据集 (含数据集下载链接)

数据集简介&#xff1a; 该数据集为跌倒检测数据集&#xff0c;属于imageclassify任务&#xff0c;分为fall和nofall两大类&#xff0c;累计共1000张图片&#xff0c;均为人工标注 xml格式&#xff0c;可用于yolo训练。 数据集链接&#xff1a;跌倒检测数据集&#xff08;1000…

【软件测试】bug篇|软件测试的生命周期|描述bug的要素|bug的级别|bug的生命周期|高频面试题:与开发产⽣争执怎么处理

目录 一、软件测试的⽣命周期 二、BUG 2.1 bug的概念 2.2 描述bug的要素 2.3 bug级别 2.4 bug的⽣命周期 &#x1f4a1;2.5 与开发产⽣争执怎么办&#xff08;⾼频考题&#xff09; &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

Python筑基之旅专栏(导航)

目录 一、Python筑基之旅专栏博文清单及链接 二、推荐阅读 一、Python筑基之旅专栏博文清单及链接 01、溯源及发展 02、变量和数据类型 03、搭建Python开发环境及库 04、两个重要函数/列表/元组 05、字符串(一) 06、字符串(二) 07、字符串(三) 08、字典 09、集合 10…

Taro React组件开发 —— RuiVerifySlider 行为验证码之滑动拼图

1. 效果预览 2. 使用场景 账号登录,比如验证码发送,防止无限调用发送接口,所以在发送之前,需要行为验证! 3. 插件选择 AJ-Captcha行为验证码文档AJ-Captcha行为验证码代码仓库为什么要选用【AJ-Captcha行为验证码】呢?因为我们管理后台使用的是 pigx ,它在后端采用的是【…

HX-100调频广播覆盖专用天线

HX-100全向天线是北京恒星科通科技发展有限公司自主研发的一款隧道专用宽带调频发射天线&#xff0c;采用圆盘形结构、振子采用铝合金材料制造&#xff0c;具有增益高、功率容量大、工作频带宽、安装方便、防腐防潮、抗风性能好等特点&#xff0c;特别适合隧道调频广播覆盖、地…

【制作100个unity游戏之26】unity2d横版卷轴动作类游13(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言存储点灯光后处理存储位置信息存储更多数据存储场景信息持久化存储数据引入Unity 的可序列化字典类调用 游戏结束源码完结 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各…

拆分字段——kettle开发11

一、拆分字段 1、拆分字段就是将一个字段拆分为多个字段&#xff0c;原字段就不存在数据流之中&#xff0c;拆分的规则是按照一个的分隔符进行拆分。具体语法如下图所示。 2、实操将EXCEL中name拆分为firstname 和 lastname,具体转换包括EXCEL输入、拆分字段、EXCEL输出。 EXC…

《软件方法(下)》8.3.4.5和《设计模式》中用语的区别

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.4 类关系再整理 有了前面的知识&#xff0c;我们需要再整理一下类的关系。用类图表示类的关系如图8-134。 图8-134 “类的…

如何进行硬件监控

在复杂的技术环境中&#xff0c;人们很容易忘记硬件资源的重要性&#xff0c;IT 行业的爆炸性增长使得监控各种硬件资源变得越来越重要&#xff0c;在处理运行关键业务应用程序并在日常基础上启用全局操作的大型网络时&#xff0c;保护这些网络环境的基本构建块至关重要。硬件监…

苗情灾情监控系统—提高农业生产效率

TH-MQ2苗情灾情监控系统是一种用于监测农作物生长状况和灾情的设备&#xff0c;通过实时监测和数据分析&#xff0c;帮助农民及时了解作物生长情况&#xff0c;采取相应的管理措施&#xff0c;提高农业生产效率和降低生产成本。 该系统通常由多种传感器、摄像头、数据传输模块等…

IDEA软件和插件安装

安装IDEA版本&#xff1a;IDEA windows 2021.1.3 使用该版本的IDEA&#xff0c;并且安装下面插件后&#xff0c;个人认为非常好用&#xff0c;并且可以不用破解&#xff0c;无限使用企业版&#xff0c;了解具体方法可以留言或私信。 记录几个好用的IDEA插件&#xff0c;后续持…