当前位置: 首页 > news >正文

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语言一维数组及二维数组详解

引言&#xff1a; 小伙伴们&#xff0c;我发现我正文更新的有些慢&#xff0c;但相信我&#xff0c;每一篇文章真的都很用心在写的&#xff0c;哈哈&#xff0c;在本篇博客当中我们将详细讲解一下C语言中的数组知识&#xff0c;方便大家后续的使用&#xff0c;有不会的也可以当…...

11.图像边缘检测的原理与实现

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征&#xff0c;所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...

RVM安装ruby笔记

环境 硬件&#xff1a;Macbook Pro 系统&#xff1a;macOS 14.1 安装公钥 通过gpg安装公钥失败&#xff0c;报错如下&#xff1a; 换了几个公钥地址&#xff08;hkp://subkeys.pgp.net&#xff0c;hkp://keys.gnupg.net&#xff0c;hkp://pgp.mit.edu&#xff09;&#xff0c;…...

电力系统负荷预测方法

电力系统负荷是什么&#xff1f; 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础&#xff0c;以特定的数学方法或者建立数学模型的方式为手段&#xff0c;通过对电力负荷历史数据进行分析&#xff0c;对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)

vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白&#xff0c;内容未加载。 填坑&#xff1a; 打包配置要用相对路径 vite.config.ts文件中的base要改成./&#xff0c;之前加了项目…...

MySQL学习笔记(持续更行ing)

级别&#xff1a; 1. 了解&#xff0c;面试概率10% 2. 掌握&#xff0c;面试概率50% 3. 重点&#xff0c;面试概率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模型和文件 参考&#xff1a;https://huggingface.co/welcome 1 注册hugging face 官网注册&#xff0c;并获取token【https://huggingface.co/settings/tokens】&#xff0c;用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...

Rust 开发的高性能 HTTP 请求工具

一、简述 在现在的软件开发领域&#xff0c;HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说&#xff0c;能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目&#xff0c;它被设计来高效执行HTTP请求&#…...

Android Studio 通过 WIFI 调试手机 app

操作流程 首先第一步&#xff0c;PC 和手机都需要连在同一个局域网 WIFI。 第二步&#xff0c;手机 USB 连上 PC&#xff0c;确保能查看到通过 USB 连上的设备&#xff1a; >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...

RabbitMQ高级笔记

视频链接&#xff1a;【黑马程序员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. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行&#xff0c;考研数学哪有这么容易的&#xff01; 先说说这两本习题册&#xff0c;李永乐老师推出的新版660题&#xff0c;相较于18年前的版本&#xff0c;难度略有降低&#xff0c;更加适合初学者。因此&#xff0c;对于处于基础阶段的学习者来说&#xff0c;新版660…...

【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)

1. Redis客户端 Jedis 以redis命令作为方法名称&#xff0c;学习成本低&#xff0c;但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使用&#xff08;必须为每个线程分配独立的Jedis连接&#xff09; lettuce 基于Netty实现&#xff0c;支持同步、异步和…...

Java中Filter和Interceptor的区别

概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet&#xff0c;而Interceptor不…...

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求&#xff0c;要在每天凌晨5点的时候执行一个任务&#xff0c;获取一系列的PDF文件并解析。 后端是Django框架&#xff0c;定时任务用Celery来实现的。 本地跑没什么问题&#xff0c;但是一放到服务器上跑就会宕机&#xff0c;而且是毫无征兆的宕机&#xff0c;…...

SpringBoot单元测试剖析

SpringBoot作为一种流行的Java框架&#xff0c;其单元测试的重要性不言而喻。在这篇博客中&#xff0c;我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节&#xff0c;它是对软件中的最小可测试单元进行检查和验证。对于…...

【华为OD机试C++】计算某字符出现次数

文章目录 描述输入描述输出描述示例代码 描述 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出输入字符串中该字符的出现次数。&#xff08;不区分大小写字母&#xff09; 数据范围&#xff1a; 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是没问题的&#xff1a; update( select …...

验证码demo(简单实现)

前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool&#x1f36c;…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...