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🍬…...
C#面:虚函数和抽象函数的区别
C#中的虚函数和抽象函数都是实现多态性的重要概念,但它们有一些区别。 定义方式: 虚函数:在基类中使用 virtual 关键字定义,可以在派生类中被重写。抽象函数:在抽象类或接口中使用abstract 关键字定义,必…...
Vidmore Video Fix for Mac 视频修复工具
Vidmore Video Fix for Mac是一款功能强大且易于使用的视频修复工具,专为Mac用户设计。它凭借先进的视频修复技术,能够帮助用户解决各种视频问题,如视频文件损坏、无法播放、格式不支持等。 软件下载:Vidmore Video Fix for Mac v…...
Docker容器与虚拟化技术:OpenEuler 部署 Docker UI
目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…...
328——二维矩阵值变为1最小操作次数 next、nextInt、nextLine
一、next、nextInt、nextLine区别 1.next() next()不光是接收键盘输入的内容,而且还进行分割。例如默认分隔符为空格 Scanner sc new Scanner(System.in);while (true){String str sc.next();System.out.println(str "A");}// 输出结果 input&#…...
HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)
同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…...
基于MiniExcel的三种常用导出Excel方法(固定列导出、动态列导出、按模板导出)
为了方便代码编写和测试,把很多代码都放在一个class里面,实际开发根据需要放到对应的目录下即可。 1.使用nuget下载安装miniexcel; 2.编写对应的测试接口,具体代码如下: using Microsoft.AspNetCore.Authorization; using Micr…...
MATLAB科研绘图与学术图表绘制从入门到精通
💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…...
C++核心高级编程 --- 1、内存分区模型 2、引用
文章目录 第一章:1.内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 第二章:2.引用2.1 使用2.2 注意事项2.3 做函数参数2.4 做函数返回值2.5 本质2.6 常量引用 第一章: 1.内存分区模型 4个区域: 代码区:存放…...
winform日历控件_进度条控件
在 Windows Forms 应用程序中使用日历控件 (如 MonthCalendar 或 DateTimePicker) 和进度条控件 (如 ProgressBar) 是一个很好的练习,以了解这些控件的工作方式。以下是一些基本的步骤来实践这些控件: 日历控件: 添加 MonthCalendar 控件&am…...
Java进阶-反射的详解与应用
本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…...
国外数码印花图案设计网站/爱站数据官网
时间限制:1秒 空间限制:65536K 热度指数:395算法知识视频讲解题目描述对给定的字符串(只包含z,o,j三种字符),判断他是否能AC。 是否AC的规则如下: 1. zoj能AC; 2. 若字符串形式为xzojx,则也能AC,…...
wordpress h5 视频播放/百度搜索风云榜排名
问题描述: -------- DB2, 使用应用用户import数据时报错: SQL0572N Package "NULLID.SQLUAK20" is inoperative. SQLSTATE51028 原因分析: --------- db2updv105会使一些package失效,如果数据库参数AUTO_REVAL为DISABLED,那么就可能遇到这个问题(从旧版本9.5升级上…...
滁州 来安县建设局网站/宁波品牌网站推广优化
苏生不惑第257 篇原创文章,将本公众号设为星标,第一时间看最新文章。之前分享过5分钟搞定b站答题成为正式会员,每天自动刷经验值升级账号,不过那个GitHub仓库已经被删了,作者提供了本地版本和腾讯云版本,我…...
教学设计模板/佛山seo关键词排名
0x00 抓包分析简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成!0x01 加密逻辑分析搜索su可以很快找到加密的位置,上图看到e.su和e.sp都是由sinaSSOEncoder这个函数生成的,…...
怎么查那些人输入做网站/seo技术培训江门
神经网络的梯度下降(Gradient descent for neural networks) 假设单隐层神经网络会有W[1]W^{[1]}W[1],b[1]b^{[1]}b[1],W[2]W^{[2]}W[2],b[2]b^{[2]}b[2]这些参数,还有个nxn_xnx表示输入特征的个数&…...
中国互联网协会是什么单位/seo快照推广
一、从一个微信Bug说起 问题:在微信Android客户端,一张七牛CDN上的HTTPS链接的图片,用微信浏览器打开可以正常访问,但是,长按图片保存时,却提示下载图片失败。发现这个问题后,我用了一个简单的测…...