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;
}

 十.小结

在本篇博客中我们介绍了一维数组和二维数组的创建初始化等初步使用,并在最后补充了一下初步的二分查找,希望本篇博客对你掌握二维数组有所帮助,谢谢您的点赞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题:C语言经典例题之水仙花

题目描述 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;它是这样定义的&#xff1a;“水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如&#xff1a;153135333。请输出所有的“水仙…

公司只有一个测试,要怎么继续呆下去?

在面试的时候&#xff0c;面试官可能会问&#xff1a;小公司、小团队&#xff0c;岗位就你一个人&#xff0c;怎么做 &#xff1f; 或者已经有的小伙伴已经在公司中面临只有一个测试的处境&#xff0c;这个时候我们应该怎么处理呢&#xff1f; 一 原因分析 公司只有一个测试人…

OSPF中配置静态路由实验简述

静态路由协议和OSPF&#xff08;开放最短路径优先&#xff09;协议是两种常见的路由协议&#xff0c;它们在路由选择和网络管理方面有一些区别。他们可以共存。 静态路由协议需要手动配置路由表&#xff0c;不会自动适应网络拓扑变化&#xff0c;适用于小型网络或者网络拓扑变化…

MySQL Innodb 引擎中预防 Update 操作上升为表锁

一、MySQL 如何预防 Update 上升为表锁 在 MySQL 中&#xff0c;进行任何数据的 修改 操作都会进行一定的锁操作&#xff0c;而锁的不同直接导致性能的差异。例如 MyISAM 引擎&#xff0c;更新时采用表锁&#xff0c;并发性较差。而 Innodb 引擎支持事务&#xff0c;更新时采用…

Windows SDK(五)按钮静态文本与编辑框控件

我们首先应该知道&#xff0c;所谓按钮静态文本等等控件都是窗口&#xff0c;他们都是隶属于父窗口下的子窗口&#xff0c;所 以在创建控件前&#xff0c;我们要首先创建一个父窗口&#xff0c;此处我们直接使用Windows桌面程序创建时&#xff0c;程 序自动为我们创建的一个窗…

类和对象(下)--- 初始化列表、explicit、友元、static、匿名对象和内部类

本篇将会对类和对象的主要知识收尾&#xff0c;先会对构造函数进行补充&#xff0c;分别补充了构造函数体赋值、初始化列表、explicit 关键字&#xff0c;然后介绍 static 成员知识以及友元、内部类还有匿名对象等知识点&#xff0c;目录如下&#xff1a; 目录 1. 构造函数补充…

VUE3——生命周期

Vue3.0中可以继续使用Vue2.x中的生命周期钩子&#xff0c;但有有两个被更名&#xff1a; beforeDestroy改名为 beforeUnmountdestroyed改名为 unmounted Vue3.0也提供了 Composition API 形式的生命周期钩子&#xff0c;与Vue2.x中钩子对应关系如下&#xff1a; beforeCreate&g…

【ROS 笔记5】话题发布与订阅————高级(一)

1. 前言 在使用ros pulisher时, 我们在建立话题 pub = rospy.Publisher(chatter, String, queue_size=10) 我们的目的时将我们的message (string)通过话题发布出去,如:pub.publish(hello_str)。 如果是为了处理单个话题的问题, 我们只用一个pub.publish()去发布就好。 …

matlab学习(一)(3.26-4.1)

一.信息隐藏的概念 信息隐藏是利用一些技术&#xff0c;使得要隐藏的信息是用眼睛看不出变化的。它将秘密信息隐藏在可公开的媒体信息中&#xff0c;使人们凭直观的视觉和听觉难以察觉基存在。 二.空域信息隐藏技术 空域信息隐藏是将信息直接嵌入到图像的像素值中的技术。主要…

洛谷 P2658 汽车拉力比赛

思路&#xff1a;二分BFS 题目的大意就是找出一个难度系数&#xff0c;让到达每一个路标之间的相邻格子的高度之差为难度系数。 所以&#xff0c;想要找到这个难度系数&#xff0c;我们需要不断地枚举数据范围内的数据&#xff0c;然后一个一个试试&#xff0c;全部BFS遍历一…

Mysql 和 Redis 数据怎么保持一致性,怎么实现

MySQL 和 Redis 是两种不同类型的数据库&#xff0c;MySQL 是关系型数据库&#xff0c;而 Redis 是键值存储的非关系型数据库。它们在数据一致性的保证上需要采取不同的策略&#xff0c;尤其是在分布式环境中。以下是一些保持 MySQL 和 Redis 数据一致性的常见策略&#xff1a;…

ISELED-演示项目代码

目录 一、main函数二、点灯函数一、main函数 int main(void) {/* Write your local variable definition here */iseledInitType.crcEnable = 1;iseledInitType.firstLedAdr = 1;iseledInitType.tempCmpEnable = 0;iseledInitType.voltSwing = 0;/*** End of Processor Expert…

简单了解裸眼3D呈现技术

裸眼3D呈现是一种不需要佩戴任何特殊设备&#xff08;如3D眼镜或头盔&#xff09;即可观看到3D效果的技术。这种技术近年来得到了快速发展&#xff0c;为观众带来了更加沉浸式的视觉体验。 实现裸眼3D呈现的关键步骤包括&#xff1a; 创建立体图像源&#xff1a;首先需要有一…

HWOD:记录正负数

一、知识点 1、scanf()的返回值 scanf()返回值类型为int&#xff0c;返回转换成功的个数 有代码int temp; scanf("%d",&temp); 在屏幕输入一个数字&#xff0c;比如5&#xff0c;回车&#xff0c;scanf()返回1 在屏幕输入一个字符或字符串&#xff0c;比…

STM32 M3内核寄存器概念

内容主要来自<<M3内核权威指南>> 汇编程序中的最低有效位&#xff08;Least Significant Bit&#xff09;。LSB是二进制数中最右边的位&#xff0c;它代表了数值中的最小单位。在汇编程序中&#xff0c;LSB通常用于表示数据的最小精度或者作为标志位。 ---------…

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff…

linux下tar命令的压缩和解压详细使用方法

在Linux系统中&#xff0c;tar命令用于创建、查看、提取和解压 tar 存档文件。以下是 tar 命令的一些常见用法&#xff1a; 压缩文件或目录&#xff1a; tar -czvf archive.tar.gz /path/to/directory # 压缩目录为 .tar.gz 格式的文件tar -czvf archive.tar.gz file1 file2 …

测试人员前期参与设计方案时需要注意什么?

服务的健壮性跟系统设计有很大关系&#xff0c;前期设计时考虑多一些处理逻辑&#xff0c;可以避免后期出现问题带来的损失以及修复问题的成本。 在前期讨论设计方案时测试同学也需要参与&#xff0c;而不只是埋头设计用例和测试&#xff0c;开发同学可能因为思维局限或者思考…

ssm018简易版营业厅宽带系统+jsp

营业厅宽带系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

LeetCode 977 有序数组的平方(双指针法)

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 […