C语言一维数组及二维数组详解
引言:
小伙伴们,我发现我正文更新的有些慢,但相信我,每一篇文章真的都很用心在写的,哈哈,在本篇博客当中我们将详细讲解一下C语言中的数组知识,方便大家后续的使用,有不会的也可以当作知识点补充哟,那我们正文开始吧!
一.数组的概念
所谓数组,就是一组相同类型元素的集合,那么也就是说数组中存放的数据可以是一个或者多个,但是数组元素不能为0,并且在一个数组中存放的所有数据都是同一种数据类型。数组分为一维数组和多维数组,多维数组中常见的是二维数组。
二.一维数组的创建和初始化
2.1数组创建
一维数组的基础语法如下代码所示:
type arr_name[常量值];
存放在数组中的元素又被称为是数组的元素,数组在创建时可以指定数组的大小和数组元素的类型,针对上述代码,还有以下需要注意的地方:
1.type指的是数组中存放数据的类型,可以是char,int,double,long long等,也可以是自定义类型。
2.arr_name指的是数组名,一般情况下自定义即可。
3.[]中的常量指定数组的大小,这个大小1根据需求而定即可。
例如:我们需要给定一个数组存储班里40人的数学成绩
double math[40];
因为成绩可能存在小数,所以我们使用double类型的数组来定义,那么既然是40人,就给定40的大小即可。
2.2数组的初始化
有些时候,我们需要给数组赋予一些初值,我们该如何操作呢?这便是数组的初始化,初始化一般使用大括号,将数据放在大括号之中。
int arr[5]={1,2,3,4,5};
//完全初始化
int arr[5]={1,2,3};
//不完全初始化
int arr[2]={1,2,3};
//错误的初始化-初始化太多
我们观察以上三种初始化方式,我们发现第一种做到了完全初始化,即数组中每个下标对应都有相应的初始值,而第二种只初始化到第三个,那么第四个和第五个数默认就是0了,第三种数组初始化方式赋值又太多,会导致程序报错。
2.3数组的类型
int arr1[10];
int arr2[12];
char ch[10];
数组也是有类型的,数组算是一种自定义类型,去掉数组名后剩下的就是数组的类型,如上述代码所示:arr1的数组类型是int [10];arr2的数组类型是int [12];ch的数组类型是char [10];
三.一位数组的使用
学会了数组的基本语法,那么我们接下来介绍一维数组的基本使用,我们先从下标这里说起
3.1数组下标
在C语言中数组是有下标的,但是这里的下标并不是从1开始,而是从0开始,假如你有一个arr[10]的数组,那么它的最大访问是arr[9],我们通过代码和图形来进一步解释。
int arr[10]={1,2,3,4,5,6,7,8,9,10};

那么,当我们访问arr[9]时,它所对应的数字应该是10才对了,如下述代码所示:
#include <stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};printf("%d\n",arr[9]);printf("%d\n",arr[0]);return 0;
}

3.2一维数组的打印
如果我们想要访问整个数组,那我们该如何操作?上文说到我们可以通过下标来指向数组元素,那么我们访问整个数组的方式也是遍历一遍所有的下标来进行打印,如下代码所示:
#include <stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};int len=sizeof(arr)/sizeof(arr[0]);//使用数组名除以数组首元素的方式来获得数组的大小for(int i=0;i<len;i++){printf("%d ",arr[i]);}return 0;
}
3.3数组的输入
我们结合数组的打印来看,既然数组需要通过下标来访问,那么我们在输入时也需要根据下标对应的位置来进行输入,如下代码所示:
#include <stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};int len=sizeof(arr)/sizeof(arr[0]);for(int i=0;i<len;i++){scanf("%d ",&arr[i]);}for(int i=0;i<len;i++){printf("%d ",arr[i]);}return 0;
}
四.一维数组在数组中的存储
有了前面这些知识,在使用一维数组解决简单问题基本就没有什么障碍了,我们继续深入数组,了解一下数组在内存中的存储,如下代码所示,依次打印数组在内存中的存储。
#include <stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};int len=sizeof(arr)/sizeof(arr[0]);for(int i=0;i<len;i++){printf("&arr[%d]=%p\n",i,&arr[i]);}return 0;
}

从输出的结果中我们不难发现,数组随着下标的增长,地址是从小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整形是四个字节),所以我们得出结论数组在内存中是连续存放的,这为将来的指针学习奠定了基础。
五.二维数组的创建
5.1二维数组的概念
前面学习的数组被称为一维数组,数组的元素都是内置类型的,我们如果把一维数组做为数组的元素,那么它就是二维数组(有点像套娃哈),二维数组为元素的数组又是三维数组,二维数组以上的数组统称为多维数组,这里我们重点讲解二维数组即可。

5.2二维数组的创建
我们该如何定义二维数组呢?语法如下所示:
type arr_name[常量1][常量2];例如:
int arr[3][5];
double data[2][5];
arr数组解释:
1.3代表数组有3行
2.5代表每行有5个元素
3.int表示数组中每个元素都是整数类型
4.arr是数组名,一般可自定义
data数组同理。
六.二维数组的初始化
在创建变量或者数组的时候,给定一些初值叫做初始化,二维数组也一样,使用大括号初始化:
6.1不完全初始化
int arr1[3][5]={1,2};
int arr2[3][5]={0};

6.2完全初始化
int arr[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

6.3按行执行初始化
int arr[3][5]={{1,2},{3,4},{5,6}};

6.4初始化时省略行但不能省略列
int arr1[][5]={1,2,3};
int arr2[][5]={1,2,3,4,5,6,7,8};
int arr7[][5]={{1,2},{3,4},{5,6}};

七.二维数组的使用
7.1二维数组的下标
在C语言中,规定了二维数组的行和列下标都是从0开始的,如下代码所示:
#include <stdio.h>
int main()
{int arr[2][3]={1,2,3,4,5,6};printf("%d %d",arr[0][0],arr[1][2]);return 0;
}

7.2二维数组的输入和输出
我们可以参照一维数组的打印通过下标来对二维数组进行输入和输出,这里就需要借助到两个for循环,如下代码所示:
#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(int i=0;i<3;i++){for(int j=0;j<5;j++){scanf("%d",&arr[i][j]);}}for(int i=0;i<3;i++){for(int j=0;j<5;j++){printf("%d ",&arr[i][j]);}}return 0;
}
八.二维数组在内存中的存储
像一维数组一样,二维数组在内存中也有自己独特的存储方式,如下代码所示:
#include <stdio.h>
int main()
{int arr[3][5]={0};for(int i=0;i<3;i++){for(int j=0;j<5;j++){printf("&arr[%d][%d]=%p\n",&arr[i][j]);}}return 0;
}
九.数组练习——二分差找
掌握了前面的知识后,我们就可以运用数组来解决问题了,比如经典的二分查找,也叫做折半查找,大体上就是让你找一个数字,输出它所在数组中的下标,如下代码所示:
#include <stdio.h>
int main()
{int arr[]={1,2,3,4,5,6,7,8,9,10};int left=0;int right=sizeof(arr)/sizeof(arr[0])-1;int key=7;//要查找的数字int mid=0;//记录中间元素的下标int find=0;while(left<=right){mid=(left+right)/2;if(arr[mid]>key){right=mid-1;}else if(arr[mid]<key){left=mid+1;}else{find=1;break;}}if(find==1){printf("%d\n",mid);}else{printf("没找到");}return 0;
}
十.小结
在本篇博客中我们介绍了一维数组和二维数组的创建初始化等初步使用,并在最后补充了一下初步的二分查找,希望本篇博客对你掌握二维数组有所帮助,谢谢您的点赞。
相关文章:
C语言一维数组及二维数组详解
引言: 小伙伴们,我发现我正文更新的有些慢,但相信我,每一篇文章真的都很用心在写的,哈哈,在本篇博客当中我们将详细讲解一下C语言中的数组知识,方便大家后续的使用,有不会的也可以当…...
11.图像边缘检测的原理与实现
数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征,所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...
RVM安装ruby笔记
环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…...
电力系统负荷预测方法
电力系统负荷是什么? 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础,以特定的数学方法或者建立数学模型的方式为手段,通过对电力负荷历史数据进行分析,对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...
electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)
vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白,内容未加载。 填坑: 打包配置要用相对路径 vite.config.ts文件中的base要改成./,之前加了项目…...
MySQL学习笔记(持续更行ing)
级别: 1. 了解,面试概率10% 2. 掌握,面试概率50% 3. 重点,面试概率80% 目录 1. 数据库**** 1.1. 概念**** 1.2. 分类**** 1.2.1. 关系型数据库**** 1.2.1.1. SQL**** 1.2.2. 安装**** 1.2.2.1. Navicat**** 1.2.3. 非…...
服务器配置Huggingface并git clone模型和文件
服务器配置Huggingface并git clone模型和文件 参考:https://huggingface.co/welcome 1 注册hugging face 官网注册,并获取token【https://huggingface.co/settings/tokens】,用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...
Rust 开发的高性能 HTTP 请求工具
一、简述 在现在的软件开发领域,HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说,能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目,它被设计来高效执行HTTP请求&#…...
Android Studio 通过 WIFI 调试手机 app
操作流程 首先第一步,PC 和手机都需要连在同一个局域网 WIFI。 第二步,手机 USB 连上 PC,确保能查看到通过 USB 连上的设备: >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...
RabbitMQ高级笔记
视频链接:【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…...
【Qt】QtCreator交叉编译环境配置Qt mkspec
1、问题描述 在QtCreator中配置TI AM437x的交叉编译环境后,编译时报错,错误信息如下 error: gnu/stubs-soft.h: No such file or directory2、原因分析 1)环境变量CC 搜索网络,解决方法为修改交叉编译工具目录下环境配置脚本,即执行source时的文件。 本人环境为:linux…...
点点数据K参数加密逆向分析(RPC方案跟加密算法还原)
文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...
考研数学|《1800》+《660》精华搭配混合用(经验分享)
肯定不行,考研数学哪有这么容易的! 先说说这两本习题册,李永乐老师推出的新版660题,相较于18年前的版本,难度略有降低,更加适合初学者。因此,对于处于基础阶段的学习者来说,新版660…...
【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)
1. Redis客户端 Jedis 以redis命令作为方法名称,学习成本低,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用(必须为每个线程分配独立的Jedis连接) lettuce 基于Netty实现,支持同步、异步和…...
Java中Filter和Interceptor的区别
概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet,而Interceptor不…...
记一次 pdfplumber 内存泄漏导致的服务器宕机
有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。 后端是Django框架,定时任务用Celery来实现的。 本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,…...
SpringBoot单元测试剖析
SpringBoot作为一种流行的Java框架,其单元测试的重要性不言而喻。在这篇博客中,我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节,它是对软件中的最小可测试单元进行检查和验证。对于…...
【华为OD机试C++】计算某字符出现次数
文章目录 描述输入描述输出描述示例代码 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1 \le n \le 1000 …...
ORA-01779 BYPASS_UJVC 11.2后废弃了
有这么个update语句 update A t set status 1 where exists (select 1 from B B where B.code A.code) 因性能问题需要修改写法。 在oracle10G这么update是没问题的: update( select …...
验证码demo(简单实现)
前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool🍬…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

