玩转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. 识别验证码并登录 书籍推荐 专栏导读 …...
Hardentools命令行模式详解:在虚拟机中安全加固Windows系统的终极指南
Hardentools命令行模式详解:在虚拟机中安全加固Windows系统的终极指南 【免费下载链接】hardentools Hardentools simply reduces the attack surface on Microsoft Windows computers by disabling low-hanging fruit risky features. 项目地址: https://gitcode…...
SmolVLA部署案例:树莓派5+USB GPU加速器运行SmolVLA轻量版可行性探索
SmolVLA部署案例:树莓派5USB GPU加速器运行SmolVLA轻量版可行性探索 1. 引言 你有没有想过,让一个巴掌大的树莓派也能跑起来一个能“看懂”世界、听懂指令、并控制机器人动作的AI模型?这听起来像是科幻电影里的场景,但今天我们要…...
ccmusic-database从零开始:基于ccmusic-database微调新增流派(如国风/电子)
ccmusic-database从零开始:基于ccmusic-database微调新增流派(如国风/电子) 1. 项目介绍与背景 音乐流派分类是音频分析领域的重要应用,ccmusic-database项目基于深度学习技术,能够自动识别音频文件的音乐流派。这个…...
别再死记硬背TTS原理了!用Python+TensorFlow复现一个简易Deep Voice,从音素到语音全流程拆解
用PythonTensorFlow实战Deep Voice:从音素到语音的完整实现指南 当你第一次听到计算机生成的语音时,是否好奇过这背后的魔法是如何实现的?现代文本转语音(TTS)系统已经能够产生几乎与真人无异的语音,而Deep Voice作为早期端到端TT…...
太原理工大学Web开发历年真题解析:期末复习必备指南(附最新试卷)
太原理工大学Web开发核心考点深度剖析与高效复习方法论 Web开发课程期末备考的战略视角 又到了期末季,作为太原理工大学计算机相关专业的学生,面对Web开发这门实践性极强的课程,你是否还在为如何高效复习而焦虑?不同于传统理论课…...
Ostrakon-VL-8B与传统算法对比展示:在复杂背景下的菜品分割
Ostrakon-VL-8B与传统算法对比展示:在复杂背景下的菜品分割 不知道你有没有遇到过这样的烦恼:想给美食拍张照,结果背景里堆满了杂乱的餐具、餐巾纸,甚至还有手机和钥匙,想单独把菜品抠出来,用传统的修图工…...
vLLM-v0.17.1与卷积神经网络(CNN)结合:多模态推理架构探索
vLLM-v0.17.1与卷积神经网络结合:多模态推理架构探索 1. 前沿技术融合带来的突破 当视觉理解遇上语言推理,会产生怎样的化学反应?我们最近尝试将vLLM-v0.17.1大语言模型与卷积神经网络(CNN)图像编码器相结合…...
告别手动维护!用DataX-Web搞定MySQL到ClickHouse的增量同步(含时间戳配置)
高效构建MySQL到ClickHouse的增量同步管道:DataX-Web实战指南 在数据驱动的商业环境中,企业每天都会产生海量的业务数据。这些数据通常存储在OLTP系统如MySQL中,但为了进行分析和报表生成,我们需要将这些数据同步到OLTP系统如Clic…...
猫抓插件:5分钟掌握浏览器视频下载终极指南
猫抓插件:5分钟掌握浏览器视频下载终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过想要保存网页视频却找不到下载按钮的烦恼?或者想收藏在线音乐却只…...
不止是上网:用PVE虚拟的OpenWRT旁路由解锁Docker、AdGuard Home和异地组网玩法
解锁PVE虚拟OpenWRT旁路由的进阶玩法:从Docker到智能家居中枢 在家庭网络架构中,OpenWRT旁路由早已超越了简单的网关转发角色。当它运行在PVE虚拟化环境中时,这个轻量级Linux系统(仅需1G内存)可以变身为多功能家庭网络…...
