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


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring AOP失效的场景事务失效的场景

场景一&#xff1a;使用this调用被增强的方法 下面是一个类里面的一个增强方法 Service public class MyService implements CommandLineRunner {private MyService myService;public void performTask(int x) {System.out.println("Executing performTask method&quo…

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

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

java对象的比较

一.PriorityQueue中插入对象 优先级队列在插入元素时有个要求&#xff1a;插入的元素不能是null或者元素之间必须要能够进行比较&#xff0c;那优先级队列中能否插入自定义类型对象呢&#xff1f; 堆中插入元素时&#xff0c;必须要进行元素的比较&#xff0c;而此时Card是没有…

Java入门-java的集合框架

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

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测

目前现状 无法客观、方便地掌握护林员的到位情况&#xff0c;因而无法有效地保证巡护人员按计划要求&#xff0c;按时按周期对所负责的林区开展巡护&#xff0c;使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理&#xff0c;现场状况、位置等信息描述…

pycharm打开服务器(linux)上的项目

先在本地打开项目 一、项目文件配置 tools-deployment-configuration 新增一个sftp连接 测试服务器是否可以连通 mappings中设置本地路径和服务器上的路径 二、环境配置 先参考文章 复现论文的conda环境&#xff08;win和联网、离线linux&#xff09;_conda复现环境-CSDN博…

Qt pro工程文件编写汇总(区分debug和release、32位和64位的方法,编译输出目录等)

前言&#xff1a; 从事qt开发已经好几年了&#xff0c;但有关pro编写的一些细节问题一直没有一个很好的梳理汇总——因为实际工作开发中&#xff0c;往往只需要编译特定版本的软件&#xff08;例如32位release版本&#xff09;&#xff0c;项目创建好后并设置好编译路径&#x…

美团Java社招面试题真题,最新面试题

如何处理Java中的内存泄露&#xff1f; 1、识别泄露&#xff1a; 使用内存分析工具&#xff08;如Eclipse Memory Analyzer Tool、VisualVM&#xff09;来识别内存泄露的源头。 2、代码审查&#xff1a; 定期进行代码审查&#xff0c;关注静态集合类属性和监听器注册等常见内…

逻辑分析仪的调试使用

调试软件下载&#xff1a;点击跳转 一、接线 逻辑分析仪 设备 GND --- GND CHX&#xff08;数据通道&#xff09; --- 通信引脚 二、数据采集 图中两个可以选择数字大小的地方分别表示 采样深度 &#xff08;10M Samples&a…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构&#xff0c;成为了人们构建代码的基础。你可以使用定义常…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

xml篇---提取VOC格式的坐标,并按照cameraID进行排序(二)

xml篇—提取VOC格式的坐标&#xff0c;并按照cameraID进行排序&#xff08;二&#xff09; import os import xml.etree.ElementTree as ETdef parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot()objects {}for obj in root.findall(object):name obj.find(…

使用ResNet-50训练自己的数据集(花的种类)

1.数据集处理 具体操作 1.把不同类别的花&#xff08;或者自己数据集的不同类别&#xff09;放在不同的文件夹下 2.文件夹名字是花朵类别 代码预处理 # 对数据集进行处理 import os from shutil import copy import randomdef mkfile(file):if not os.path.exists(file):os…

简易计算器

前言 简易计算器&#xff0c;旨在实现一个简单的计算器功能。 整形&#xff0c;浮点型数据的加减乘除运算&#xff1b;数据的统计(如文件中某字符的出现频数)&#xff1b;期望&#xff0c;方程运算&#xff1b;平均数&#xff0c;最小值&#xff0c;最大值&#xff0c;中位数…

每日5题Day11 - LeetCode 51 - 55

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>…

揭秘订单排队模式:社交电商新策略

随着移动互联网的蓬勃发展&#xff0c;社交电商正以其独特的魅力席卷全球。据权威机构预测&#xff0c;到2024年&#xff0c;全球社交电商市场规模有望达到惊人的2.8万亿美元。面对如此庞大的市场蛋糕&#xff0c;如何精准把握机遇&#xff0c;实现业务的跨越式增长&#xff0c…

SQL157 平均播放进度大于60%的视频类别

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:30011NULL210220012021-10-01 10:00:002021-10-01 10:00:21001NULL310320012021-10-01 11:00:502021-10-01 11:01…

强大的医院绩效考核管理系统源码,支持行业内所有绩效方案,且每步核算都可自主进行方案的新建、调整。

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件源码。 系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统…

定时调度任务——kettle开发22

一、流查询 流查询在查询前把数据加载到内存中&#xff0c;并且只能进行等值查询。 流查询的操作包括指定数据源&#xff0c;即我们将数据进行流查询的数据源头&#xff0c;如下图所示流查询的数据源是我们的Excel输入-departments&#xff0c;然后我们还需要指定我们进行流查…

手机远程协助,3个方法,开启沟通新篇章

已经不仅仅是一个通讯工具&#xff0c;更是一个多功能的魔法棒。它轻轻一挥&#xff0c;就能让我们跨越千山万水&#xff0c;与亲朋好友、合作伙伴进行亲密无间的交流。今天&#xff0c;就让我们一起探讨如何利用手机远程协助的三大法宝&#xff0c;开启沟通的新篇章&#xff0…