C语言基础——数组

news2024/9/21 20:26:13

 {\▁/}

 ( / 。\ )

   / ⊃💔\⊃

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

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.coloradmin.cn/o/1702393.html

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

相关文章

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的&#xff0c;学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

链接预测.

在某些场景中&#xff0c;用户可能希望预测给定节点之间是否存在边&#xff0c;这样的任务称作链接预测任务。 假设输入结点之间是全链接图&#xff0c;连接预测的目的是给边打上标签。 挑战 最简单的是用图的邻接矩阵来表示结点之间的边&#xff0c;但当节点数量多的时候&am…

【C++】从零开始map与set的封装

送给大家一句话&#xff1a; 今日的事情&#xff0c;尽心、尽意、尽力去做了&#xff0c;无论成绩如何&#xff0c;都应该高高兴兴地上床恬睡。 – 三毛 《亲爱的三毛》 &#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x…

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

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

Hunyuan-DiT环境搭建推理测试

引子 最近鹅厂竟然开源了一个多模态的大模型&#xff0c;之前分享福报厂的多模态视觉大模型&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;感兴趣的可以移步。鹅厂开源的&#xff0c;我还是头一回部署。好的&#xff0c;那就让我们看看这个多模态视觉大模型有…

今日选题。

诱导读者点开文章的9引真经&#xff08;一&#xff09; 标题重要么&#xff1f;新媒体、博客文通常在手机上阅读。首先所有的内容不同于纸媒&#xff0c;手机只展现标题&#xff0c;而内容都是折叠。其次读者能像看内容一样看4、5条或者7、8条标题&#xff08;区别于不同的主流…

LayUI使用(一)点击树组件的右边空白区域也可响应事件

前提&#xff1a; 如下&#xff0c;希望能够点击右边的空白区域也能够响应&#xff0c;而不仅仅是点击文本才响应 分析流程 一开始问了chatgpt&#xff0c;但它给的方案太麻烦了&#xff0c;而且还有错误&#xff0c;因此自己上手F12进入调试模式&#xff0c;点击查看最终渲…

SpringBoot——整合SLF4j进行日志记录

目录 日志 项目总结 新建一个SpringBoot项目 pom.xml application.properties项目配置文件 logger.xml日志配置文件 TestController控制器 SpringbootSlf4jApplication启动类 启动项目 生成logger.log日志文件 日志 在开发中&#xff0c;我们经常使用 System.out.prin…

会声会影2023永久激活版下载 会声会影2023序列号免费 会声会影下载免费中文破解版

会声会影2023永久激活版是一款最新推出的多功能视频剪辑软件&#xff0c;这款软件不仅完美继承了之前多个版本当中的强大功能。而且我们还可以通过会声会影2023永久激活版来体验到标题动态选项、标题特效等多个全新的功能&#xff0c;让你可以更加快速地进行视频编辑。 会声会影…

爬虫利器Frida RPC入门——夜神模拟器环境篇

Frida是一款轻量级HOOK框架&#xff0c;可用于多平台上&#xff0c;例如android、windows、ios等。 frida分为两部分&#xff0c;服务端运行在目标机上&#xff0c;通过注入进程的方式来实现劫持应用函数&#xff0c;另一部分运行在系统机器上。frida上层接口支持js、python、…

备忘录可以统计字数吗?备忘录里在哪查看字数?

在这个信息爆炸的时代&#xff0c;很多人喜欢使用备忘录app来记录生活中的点点滴滴。备忘录不仅可以帮助我们记事、安排日程&#xff0c;还能提醒我们完成各种任务&#xff0c;是我们日常生活中不可或缺的小助手。 然而&#xff0c;在使用备忘录时&#xff0c;有时我们会遇到需…

(已解决)使用IDEA开发工具提交代码时,如何获取最新的commit信息历史记录

目录 问题现象&#xff1a; 问题分析&#xff1a; 方法一&#xff1a;从commit信息历史记录中选取自己想要的commit信息 总结&#xff1a; 方法二&#xff1a;直接获取commit信息历史记录中最新的commit信息 总结&#xff1a; 解决方法&#xff1a; 方法一&#xff1a;…

【云原生】Kubernetes中的List-Watch机制详解与容器生命周期

目录 引言 一、List-Watch机制概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;工作机制 1.List操作 2.Watch操作 &#xff08;三&#xff09;数据流向 1.按模块划分 2.按整体总结 二、Pod生命周期 &#xff08;一&#xff09;生命周期 1.创建…

单片机方案开发个性定制

酷得智能是玩具企业合作方案商&#xff0c;致力于为玩具企业提供一站式的智能化解决方案。我们拥有丰富的行业经验和技术实力&#xff0c;能够根据客户的需求和市场趋势&#xff0c;为其量身定制最适合的智能玩具产品和解决方案。 主营业务&#xff1a; 东莞市酷得智能科技有限…

实时工业数据采集分析平台:推动工厂智能化的关键

在当今的工业领域&#xff0c;随着科技的飞速发展和竞争的日益激烈&#xff0c;实现工厂的智能化已成为企业追求持续发展的关键目标。而实时工业数据采集分析平台作为推动工厂智能化的重要力量&#xff0c;正发挥着重要的作用。 实时工业数据采集分析平台能够全方位、高精度地…

Linux 中的进程优先级管理

在 Linux 系统中&#xff0c;理解和管理进程优先级是维护系统性能的关键因素。本文将详细介绍进程优先级&#xff08;priority&#xff09;的基本概念、如何查看和调整进程优先级&#xff0c;以及 nice 值对优先级的影响。 基本概念 在多任务操作系统中&#xff0c;CPU 资源的…

JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解

字符串和相关API java不会字符串即凉一半 学好字符串很重要 API 为应用程序编程接口 获得字符串对象 1.直接赋值 空参构造 string s1“abc”; s1 记录的是串池里的地址 2.用new的方式 string s2new string&#xff08;&#xff09;; new&#xff08;在堆内存里开辟空…

JSON-RPC跨域通信:Python服务器端解决方案与Js客户端 Mozilla扩展程序

问题背景 构建一个 Mozilla 扩展程序&#xff0c;与远程服务器上的 Python 应用程序进行通信以发送和接收数据。Python 应用程序可以通过 Python 控制台使用 xml-rpc 调用。尝试设计一个 JSON-RPC 来联系同一个应用程序。开发 Python 服务器端&#xff0c;可以通过 python 控制…

SEC批准以太坊ETF了吗?

原创 | 刘教链 隔夜BTC击穿了5日均线&#xff0c;回落至67k一线。凌晨传来美SEC批准以太坊ETF的消息&#xff0c;但是ETH上下插针&#xff0c;杵在3.8k&#xff0c;微微下跌。定睛仔细一看&#xff0c;SEC批准了&#xff0c;但又没完全批准&#xff0c;这特么是薛定谔的批准哈&…