C语言学习-数组(4)

news2025/1/14 18:09:38

目录

思维导图:

1. 一维数组的创建和初始化

1.1 数组的创建

1.2 数组的初始化

1.3 一维数组的使用

1.4 一维数组在内存中的存储

2. 二维数组的创建和初始化

2.1 二维数组的创建        

2.2 二维数组的初始化

2.3 二维数组的使用

2.4 二维数组在内存中的存储

​编辑

3. 数组越界

4. 数组作为函数参数

4.1 数组名是什么?

4.2 冒泡排序函数的正确设计

5. 数据实例:

写在最后:


思维导图:

1. 一维数组的创建和初始化

数组是一组相同类型的元素的集合。

1.1 数组的创建

例:

#include <stdio.h>
int main()
{
	int arr1[10];//数组的创建:类型名称int  数组名称arr1  数组大小[]
	             //注意:[]内需要给一个常量,不能使用变量
	char arr2[5];

	double arr3[8];

	return 0;
}

注:在C99标准支持变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

否则,编译器会报错:

1.2 数组的初始化

例:

int main()
{
	int arr[5] = { 1,2,3,4,5 };//完全初始化
	int arr2[5] = { 1,2,3 };//不完全初始化,剩余元素默认补0
	int arr3[] = { 1,2,3,4,5 };//这里没有值定元素个数,编译器会根据初始化内容确定元素个数

	int arr4[] = { 1,2,3 };//这里创建了三个元素
	int arr5[5] = { 1,2,3 };//这里创建了五个元素

	char arr6[3] = { 'a','b','c' };
	char arr7[] = { 'a','b','c' };//字符数组也是同理

	char arr8[3] = "abc";//字符串用""引起
	char arr9[] = "abc";

	return 0;
}

假如我想把两个字符数组打印出来:

#include <stdio.h>
int main()
{
	char arr6[] = { 'a','b','c' };
	char arr9[] = "abc";
	printf("%s\n", arr6);
	printf("%s\n", arr9);
	return 0;
}

输出结果:

为什么会出现 “烫烫” 之类的东西呢?

通过调试我们会发现,用字符串的形式创建的数组会自动创建一个‘\0’在最后。

printf在查找数组元素时,遇到‘\0’(字符串结束标志)才会停下,如果找不到,就会出现未知情况

这时候只要在arr6数组最后添加一个‘\0’就好了:

1.3 一维数组的使用

例:


//按顺序打印一个数组
//数组通过下标访问(下标从0开始)
//[]是下标访问操作符
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);//通过下标访问数组的每一个元素
	}
	return 0;
}

输出结果:

输出:1 2 3 4 5 6 7 8 9 10

1.4 一维数组在内存中的存储

 通过观察,我们发现数组的每个元素之间有四个字节,而整形int本身占四个字节

由此我们推断出数组中的元素在内存中是连续存放的。

数组也能通过指针进行访问:

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	int* p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		printf("%d ",*(p + i));//通过地址访问数组元素
	}
	return 0;
}

  输出结果:

输出:1 2 3 4 5 6 7 8 9 10

我们可以通过他们的地址验证,下标访问数组和指针访问是一样的:

2. 二维数组的创建和初始化

二维数组的创建与一维数组类似。

2.1 二维数组的创建        

int main()
{
	int arr[3][4];//第一个[]代表行数,第二个[]代表列数
	return 0;
}

2.2 二维数组的初始化

我们可以从监视中看到二维数组是怎么初始化的。 

2.3 二维数组的使用

二维数组也是通过下标进行访问。

#include<stdio.h>
int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int i = 0;
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{            //这里求的是二维数组的列数
		int j = 0;
		for (j = 0; j < sizeof(arr[0]) / sizeof(arr[0][0]); j++)
		{            //这里求的是二维数组的行数
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

输出结果:

输出:1 2 3 4 5 6 7 8 9 10 11 12

2.4 二维数组在内存中的存储

观察结果,我们发现二维数组在内存中也是连续存储的。

 自然,二维数组也能用指针进行访问。

3. 数组越界

什么是数组越界?

例:

 这里就是越界访问了,下标0~9,但是下标 i 走到了10,导致越界访问。

C语言自身是不会做数组下标的越界检查,编译器也不一定会报错,

所以我们自己要做好数组下标是否越界的检查。

4. 数组作为函数参数

4.1 数组名是什么?

4.2 冒泡排序函数的正确设计

排序的方法有很多:冒泡排序、选择排序、插入排序、快速排序等等

而今天,我打算介绍比较简单的冒泡排序。

冒泡排序的思想:两两相邻的元素进行比较,有需要的话进行交换。

例:

#include <stdio.h>

void Sort(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)//总共需要sz-1趟冒泡排序
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)//每一趟冒泡排序从哪个元素开始
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[10] = { 2,4,3,9,8,6,5,1,7,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的大小
	Sort(arr, sz);//创建一个排序函数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		printf("%d ",arr[i]);//打印数组
	}
	return 0;
}

输出结果:

输出:1 2 3 4 5 6 7 8 9 10

5. 数据实例:

运用数组知识,我做了三子棋和扫雷,如果感兴趣的话,可以点开链接哦!

数组的应用实例 1 :C语言实现三子棋详解

数组的应用实例 2 :C语言实现扫雷详解

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

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

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

相关文章

C# async / await 的使用方法

目录 一、简介 二、异步等待返回结果 三、异步方法的返回类型 四、await foreach 五、Task.Delay 结束 一、简介 await 运算符暂停对其所属的 async 方法的求值&#xff0c;直到其操作数表示的异步操作完成。 异步操作完成后&#xff0c;await 运算符将返回操作的结果&a…

【Xilinx】Zynq\MPSoc\Versal不同速度等级下的ARM主频

【Xilinx】Zynq\MPSoc\Versal不同速度等级下的ARM主频一、Zynq&#xff08;A9&#xff09;二、MPSoC(A53R5)三、Versal(A72R5F)最近有很多人在选型的时候&#xff0c;问到ARM主频的问题&#xff0c;不知道去哪里找这个参数。 授人以鱼不如授人以渔&#xff0c;基本的通用方法是…

【面试题】 TypeScript 前端面试题 由浅到深

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 基本类型介绍 1.Boolean&#xff0c;Number&#xff0c;String 声明:类型 类型对应变量 let flag:boolean true let …

【现代密码学原理】——哈希函数(学习笔记)

&#x1f4d6; 前言&#xff1a;我们在登录QQ有时会遇到密码忘记的问题&#xff0c;那么思考一下&#xff0c;为什么腾讯公司不直接把密码发还给用户而是要求设置新密码呢。其实&#xff0c;不保存密码&#xff0c;是为了更好地对密码保密&#xff0c;换言之&#xff0c;腾讯的…

力扣(LeetCode)106. 从中序与后序遍历序列构造二叉树(C++)

递归 如图&#xff0c;后序序列按照左右根遍历&#xff0c;所以根在最后。逆着后序遍历的顺序&#xff0c;按照根右左递归建树就可以复原这棵树。后序序列&#xff0c;可以确定根的位置 postrootpostrootpostroot 和根结点的值。我们在中序序列找到根结点的值&#xff0c;就确定…

《深度学习进阶 自然语言处理》第四章:Embedding层和负采样介绍

文章目录4.1 word2vec的改进一4.1.1 Embedding层4.2 word2vec的改进二4.2.1 中间层之后的计算问题4.2.2 从多分类到二分类4.2.3 负采样总结之前文章链接&#xff1a; 开篇介绍&#xff1a;《深度学习进阶 自然语言处理》书籍介绍 第一章&#xff1a;《深度学习进阶 自然语言处…

想知道有没有拍照转文字的软件?这3款工具职场人士必备

你们在工作上有没有遇到这种情况&#xff0c;就是领导突然甩一份纸质文件给你&#xff0c;并要求整理成电子版&#xff0c;供其他同事查阅。回想我当初刚踏入职场时&#xff0c;没有什么工作经验&#xff0c;只会对照着内容手动码字输出&#xff0c;但是太浪费时间了&#xff0…

湖北银行冲刺上市:不良率高于行业均值,有公司欠5亿元未能追回

撰稿|汤汤 来源|贝多财经 最近&#xff0c;湖北银行正式向A股递交申请材料&#xff0c;准备在上海证券交易所上市。 据贝多财经了解&#xff0c;湖北银行股份有限公司&#xff08;下称“湖北银行”&#xff09;于2022年11月4日在证监会预披露招股书&#xff0c;计划在上交所…

Azide-PEG-Aldehyde,N3-PEG-ALD,叠氮-PEG-醛基可用于新材料研究

化学试剂叠氮-聚乙二醇-醛基&#xff0c;其英文名为Azide-PEG-Aldehyde&#xff08;N3-PEG-ALD&#xff09;&#xff0c;它所属分类为Aldehyde / Acetal PEG Azide PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;5000 N3-PEG-ALD、10000 叠氮-PEG-醛基、1000 N3-PE…

短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

SpringMVC 请求流程源码分析

三哥 内容来自【自学星球】 欢迎大家来了解我的星球&#xff0c;和星主&#xff08;也就是我&#xff09;一起学习 Java &#xff0c;深入 Java 体系中的所有技术。我给自己定的时间是一年&#xff0c;无论结果如何&#xff0c;必定能给星球中的各位带来点东西。 想要了解更多&…

使用robot+selenium创建一个UI自动化测试用例

新建项目并安装robotframework pip install robotframework 在pycharm-插件&#xff0c;输入robot搜索插件 选择Robot Framework Language Server或者Hyper RobotFramework Support安装 新建test.robot文件编写测试用例test.robot robot用例文件通常包括4个头部分&#xf…

Substance Painter 的一些玩法笔记

Substance Painter 的一些玩法 1、模型边缘磨损效果&#xff1a; 参考连接&#xff1a;Substance Painter 后期添加法线贴图&#xff0c;处理边缘磨损&#xff01;_哔哩哔哩_bilibili 使用方法&#xff1a; 1、导入要处理的模型文件 2、烘焙 模型贴图(主要是法线) 3、创建一个…

接口api 之Swagger 一次实战探索

今天我们来说说什么是Swagger&#xff1f; 就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述文件可以去更新接口文档&#xff0c;以及生成各端代码。而Springfox-swagger,则可以通过扫描代码去生成这个描述文…

自学CFD:我在实习岗速成无人机设计和仿真的故事

一、写在前面 大家好&#xff0c;我叫Jack&#xff08;硕士在读&#xff09;&#xff0c;目前在企业实践学习。 作为一名门外汉&#xff0c;初识计算流体力学&#xff0c;经历了盲目无措、乱做一气&#xff0c;查资料找经验毫无进展&#xff0c;直到从B站遇到了Graychen老师。…

综合布线工程测试技术

一、测试的相关基础知识 综合布线工程测试内容主要包括三个方面:工作区到设备间的连通状况测试、主干线连通状况测试、跳线测试。 每项测试内容主要测试以下参数:信息传输速率、衰减、距离、接线图、近端串扰等。 1、接线图(Wire Map) 接线图是用来检验每根电缆末端…

24、四大函数式接口(有函数型接口和断定型接口(都是函数式接口))

四大函数式接口&#xff08;有函数型接口和断定型接口&#xff08;都是函数式接口&#xff09;&#xff09; 新时代程序员&#xff1a;lambda表达式&#xff0c;链式编程&#xff0c;函数式接口&#xff0c;Stream流式计算 函数式接口&#xff1a;只有一个抽象方法的接口&…

热门Java开发工具IDEA入门指南——从Eclipse迁移到IntelliJ IDEA(二)

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 本文…

HTML非遗文化网页设计题材【京剧文化】HTML+CSS(大美中国 14页 带bootstarp)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;…

Publisher/Subscriber 订阅-发布模式原理解析

Publisher/Subscriber 订阅-发布模式原理解析 参考资料 What Is Pub/Sub? Publish/Subscribe Messaging Explained什么是serverless&#xff1f;Pub/Sub Examples: 5 Use Cases to Understand the Pattern and its BenefitsJavaScript 设计模式精讲Avro Schema格式 一、概念…