玩转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. 识别验证码并登录 书籍推荐 专栏导读 …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
