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🍬…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

