玩转C语言——数组初探
一、前言
通过前面的学习,我们已了解C语言的结构变量、分支结构和循环结构。今天,我们一起来认识C语言的另一知识点——数组。先赞后看,养成习惯。
二、数组概念
学习数组,我们要明白数组是什么。在我看来:数组是⼀组相同类型元素的集合。
从这句话中,我们可以提取到如下的信息:
- 数组可以存放相同的数据且类型相同。
- 数组的1元素个数不为零。
数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。
三、一维数组
3.1 一维数组的创建
- 存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的⼤⼩和数组的元素类型。
- 类型说明符就是我们常用的存储类型(如:int 、short、char......)当然也可以自定义类型。
- 数组名就是自取的名字,要取得方便阅读。
- []是用来确定数组大小的,可根据需要而定。
基本创建语法如下:
int arr1[0];//0表示元素个数short arr2[0];char arr3[0];float arr4[0];double arr5[0+1];//表达式形式也可以
3.2 一维数组的初始化
在创建数组的时候,我们需要对数组进行初始化,那我们该如何进行初始化呢?且听我细细道来:
在进行初始化时,我们一般使用大括号的形式,即把数据放入大括号中。
初始化有分为:完全初始化和不完全初始化。
那什么是完全初始化什么又是不完全初始化呢?可这样理解:假如你家有五口人,每个人都能分到一包饼干,这就是完全初始化;反之,则是不完全初始化。在我们写代码过程中,大多数都是用不完全初始化。
代码如下:
int arr1[0] = { 0 };//完全初始化int arr2[2] = { 0 };//不完全初始化int arr3[3] = { 0,0 ];//不完全初始化int arr4[5];//错误初始化,在VS中会报错
3.3一维数组的类型
数组的类型就是去除数组名就是其类型,以上述代码为例:
int arr1[0] = { 0 };//数组类型为int [0]int arr2[2] = { 0 };//数组类型为int [2]char arr3[3] = { 0,0 ];//数组类型为 char [3]
3.4 一维数组的使用
在学习完基本的语法后,我们就要学习对其使用了,一维数组可以存放数据,存放数据的⽬的是对数据的操作,那我们该如何使用呢?
3.4.1 数组下标
C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下 标就相当于数组元素的编号,如下:
在C语⾔中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引⽤操作符。 有了下标访问操作符,我们就可以轻松的访问到数组的元素了.
3.4.2 数组的打印
大家是不是现在很好奇一维数组是怎么打印的。在这里提供两种方法:
法一:
#include <stdio.h>
int main()
{char arr[] = "123456";printf("%s", arr);return 0;
}
%s可以打印字符串,因此可以采用此方法。
法二:
#include <stdio.h>
int main()
{char arr[6] = { 1,2,3,4,5,6 };int i = 0;for (i = 0; i < 6; i++){printf("%d", arr[i]);}return 0;
}
此方法用之前学习过的for循环,运用循环的方式,逐个打印。
3.4.3 数组的输入
明白了打印,自然就明白了输入,这里仍提供两种方法。
法一:
#include <stdio.h>
int main()
{int arr[2] = { 1,2 };int i = 0;for (i = 0; i < 2; i++){scanf("%d", &arr[i]);}for (i = 0; i < 2; i++){printf("%d", arr[i]);}return 0;
}
整体思路和上述法二一样,运用for循环进行输入及打印。
法二:
可借助gets()进行输入。代码如下:
#include <stdio.h>
int main()
{char arr[2] = { 0 };int i = 0;gets(arr);printf("%s", arr);return 0;
}
3.4.4 数组的存储
有了前⾯的知识,我们其实使⽤数组基本没有什么障碍了,如果我们要深⼊了解数组,我们最好能了 解⼀下数组在内存中的存储。
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;for (i = 0; i < 10; i++){printf("&arr[%d] = %p\n ", i, &arr[i]);}return 0;
}
结果如下:
从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的 元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
四、二维数组
前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元 素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称 为多维数组。
4.1二维数组的创建及初始化
我们已学习了一维数组的创建及初始化,那⼆维数组如何初始化呢?像⼀维数组⼀样,也是使⽤⼤括号初始化的。
类比一维数组的定义,只不过二维数组第一个常量表达式表示行,第二个常量表达式表示列。
int arr[5][5];//创建五行五列的二维数组
char arr2[3][5];//字符型二维数组
float arr3[4][5];//浮点型二维数组
其初始化与一维数组大致一样,都分为完全初始化和不完全初始化。
int arr1[3][5] = {1,2};//不完全初始化
int arr2[3][5] = {0};//不完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};//完全初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};//按照⾏初始化
int arr5[][5] = {1,2,3};//初始化时省略⾏,但是不能省略列
4.2 ⼆维数组的使⽤
4.2.1 ⼆维数组的下标
当我们掌握了⼆维数组的创建和初始化,那我们怎么使⽤⼆维数组呢? 其实⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定 数组中的⼀个元素。 C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所⽰:
int arr[3][5] = {1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15};
4.2.2 二维数组的输入和输出
访问⼆维数组的单个元素我们知道了,那如何访问整个⼆维数组呢? 其实我们只要能够按照⼀定的规律产⽣所有的⾏和列的数字就⾏;以上⼀段代码中的arr数组为例,⾏ 的选择范围是0~2,列的取值范围是0~4,所以我们可以借助循环实现⽣成所有的下标。
int main()
{int arr[3][5] = { 1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15 };int i = 0;for(i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d", arr[i][j]);}printf("\n");}return 0;
}
结果如下:
4.2.3 ⼆维数组在内存中的存储
像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储⽅式,我们也是可以打印出数组所有元素 的地址的。代码如下:
#include<stdio.h>
int main()
{int arr[3][5] = { 1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15 };int i = 0;for(i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%p\n", &arr[i][j]);}printf("\n");}return 0;
}
结果如下:
从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元 素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。
五、数组练习
多个字符从两端移动,向中间汇聚 编写代码,演⽰多个字符从两端移动,向中间汇聚
分析:
若要完成此题,需要借个操作符:strlen和函数:Sleep。
一下是解释:
C语言中的 sleep 函数可以让当前线程暂停执行一段时间,通常用于模拟实际运行环境下的等待或延时操作。在 Windows 和 Linux 等主流操作系统中,sleep 函数的实现方式略有不同,但其基本原理都是通过让线程进入睡眠状态来实现等待或延时的效果。
其中,seconds 参数表示线程需要暂停的秒数。sleep 函数返回值为 0,表示线程成功地暂停了指定的秒数,如果 sleep 函数被其他信号打断,则返回值为剩余需要暂停的秒数。
需要注意的是,sleep 函数的参数类型为 unsigned int,而不是浮点数类型。如果需要暂停小于 1 秒的时间,可以使用 usleep 函数,它的参数类型为微秒(unsigned int),可以精确地控制线程的等待时间。在每次输出之后,使用 sleep 函数暂停 1 秒,模拟实际运行环境下的延时操作。需要注意的是,在使用 sleep 函数时,应该将输出立即刷新到控制台上,否则可能会出现输出延迟的情况。
另外,需要注意的是,sleep 函数会让当前线程进入睡眠状态,因此在调用 sleep 函数时,应该确保当前线程已经完成了所有需要执行的操作,否则可能会导致程序出现不可预测的结果。同时,需要注意不要在循环中频繁地调用 sleep 函数,否则可能会降低程序的性能,影响程序的正常运行。
需要注意的是,在不同的操作系统中,sleep 函数的精度和可靠性可能会有所不同。在一些嵌入式系统中,sleep 函数的精度可能会受到系统时钟精度的限制,导致实际暂停的时间可能会比预期的时间短。因此,在使用 sleep 函数时,应该根据实际需要选择合适的等待时间,并且在代码中添加必要的异常处理机制,以确保程序的稳定性和可靠性。
总的来说:strlen是计算长度的,sleep是延迟打印。
可参考如下代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{char arr1[] = "hello,world" ;char arr2[] = "###########" ;int left = 0;int right = strlen(arr2) - 1;while (left <= right){Sleep(1000);arr2[right] = arr1[right];arr2[left] = arr1[left];left++;right--;printf("%s\n", arr2);}return 0;
}
结果如下:
六、最后
今天的学习到这里就结束了,如果有什么问题可以留言,我会尽我所能为你解答。
完!
相关文章:

玩转C语言——数组初探
一、前言 通过前面的学习,我们已了解C语言的结构变量、分支结构和循环结构。今天,我们一起来认识C语言的另一知识点——数组。先赞后看,养成习惯。 二、数组概念 学习数组,我们要明白数组是什么。在我看来:数组是⼀组…...
Nginx指令配置大全
基本命令 nginx -t 检查配置文件是否有语法错误 nginx -s reload 热加载,重新加载配置文件 nginx -s stop 快速关闭 nginx -s quit 等待工作进程处理完成后关闭配置块介绍 全局块 全局块是默认配置文件从开始到events块之间的…...
富格林:安全出金关注可信操作
富格林悉知,现货黄金投资凭借着诸多优势,成为了热门的投资产品之一,也获得了投资者的追捧。在投资中想要安全盈利出金,投资者一定要沉下心来学习专业知识和技术,这样才能在以后的投资操作中避免亏损,顺畅盈…...
DELETE、TRUNCATE 和 DROP 在MySQL中的区别及使用示例
在MySQL数据库中,DELETE、TRUNCATE TABLE 和 DROP 这三个命令分别适用于不同的数据删除需求,它们在工作原理、应用场景以及特性上有所区别。接下来,我们通过实例演示来明确这三者的不同之处。 DELETE 命令 功能与示例:DELETE 语…...
程序员应该如何选择职业赛道?
程序员选择职业赛道是一个涉及个人兴趣、技能匹配、市场需求和长远发展规划的综合决策过程。以下是一些关键步骤和考虑因素: 自我评估: 技能与专长:分析自己在编程语言、算法、数据结构等方面的现有技能,并思考这些技能更适合前端…...

深入浅出Hive性能优化策略
我们将从基础的HiveQL优化讲起,涵盖数据存储格式选择、数据模型设计、查询执行计划优化等多个方面。会的直接滑到最后看代码和语法。 目录 引言 Hive架构概览 示例1:创建表并加载数据 示例2:优化查询 Hive查询优化 1. 选择适当的文件格…...
利用卷积神经网络进行人脸识别
利用卷积神经网络(Convolutional Neural Networks, CNNs)进行人脸识别是计算机视觉领域的一个热门话题。下面是一个简化的指南,涵盖了从理论基础到实际应用的各个方面,可以作为你博文的基础内容。 理论基础 卷积神经网络简介&am…...

固态硬盘有坏道怎么恢复数据 固态硬盘坏道怎么修复
固态硬盘是一种高速、低噪音、低功耗的存储设备,但是它也有一个致命的问题——坏道。坏道是指存储芯片中的某些存储单元出现了故障,导致数据无法正常读取或写入。如果你的固态硬盘出现了坏道,那么你的数据就有可能会丢失,带来了很大的困扰。那么,固态硬盘有坏道怎么恢复数…...

adobe animate 时间轴找不到编辑多个帧按钮
如题,找了半天,在时间轴上找不到编辑多个帧按钮,导致无法批量处理帧 然后搜索发现原来是有些版本被隐藏了,需要再设置一下 勾选上就好了...

5 亿欧元巨额奖励!法国国防部启动量子初创公司项目
内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:800字丨6分钟阅读 据C4ISNET报道,法国国防部采购机构宣布向五家法国量子计算研究初创公司授予合同,用于开发量子计算技…...

Linux:系统初始化,内核优化,性能优化(2)
优化ssh协议 Linux:ssh配置_ssh配置文件-CSDN博客https://blog.csdn.net/w14768855/article/details/131520745?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171068202516800197044705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fb…...
JS08-DOM节点
DOM节点 查找节点 父节点 通过.parentNode属性可以获得某个元素的父节点,并对其进行操作。例如,隐藏.son元素的父节点。 <div class"father"><div class"son">儿子</div></div><script>let son d…...
2024/3/14打卡棋子(14届蓝桥杯)——差分
标准差分模板 差分——前缀和的逆运算(一维二维)-CSDN博客 题目 小蓝拥有 nn 大小的棋盘,一开始棋盘上全都是白子。 小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色࿰…...

A Survey on Multimodal Large Language Models
目录 1. Introduction2. 概述方法多模态指令调优 3.1.1 简介3.1.2 预备知识3.1.3 模态对齐3.1.4 数据3.1.5 模态桥接3.1.6 评估 3.2.多模态情境学习3.3.多模态思维链3.3.1 模态桥接3.3.2 学习范式3.3.3 链配置3.3.4 生成模式3.4.LLMs辅助视觉推理3.4.1 简介3.4.2 训练范式3.4.3…...
Java面向对象编程(高级)一
在Java中,面向对象编程更是核心设计理念之一,为开发者提供了丰富的工具和特性来创建灵活、可扩展的应用程序。 本博客将深入探讨Java面向对象编程的高级特性,包括但不限于多态、继承、封装、抽象类、接口等方面的内容。我们将从实际案例出发…...
1056:点和正方形的关系
【题目描述】 有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是…...

【iOS】ARC学习
文章目录 前言一、autorelease实现二、苹果的实现三、内存管理的思考方式__strong修饰符取得非自己生成并持有的对象__strong 修饰符的变量之间可以相互赋值类的成员变量也可以使用strong修饰 __weak修饰符循环引用 __unsafe_unretained修饰符什么时候使用__unsafe_unretained …...

数据分析 | Matplotlib
Matplotlib 是 Python 中常用的 2D 绘图库,它能轻松地将数据进行可视化,作出精美的图表。 绘制折线图: import matplotlib.pyplot as plt #时间 x[周一,周二,周三,周四,周五,周六,周日] #能量值 y[61,72,66,79,80,88,85] # 用来设置字体样式…...

mac npm install 很慢或报错
npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/pnpm failed, reason: certificate has expired 1、取消ssl验证: npm config set strict-ssl false 修改后一般就可以了,…...

100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别
文章目录 专栏导读一、前言二、ddddocr库使用说明1. 介绍2. 算法步骤3. 安装4. 参数说明5. 纯数字验证码识别6. 纯英文验证码识别7. 英文数字验证码识别8. 带干扰的验证码识别 三、验证码识别登录代码实战1. 输入账号密码2. 下载验证码3. 识别验证码并登录 书籍推荐 专栏导读 …...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...