数组的介绍

1.数组的概念

数组是一组相同类型元素的集合,从这个描述中我们知道:

  • 数组中存放1个或多个数据,但是数组的元素个数不为0。
  • 数组中存放的多个数据,类型是相同的。

数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

2.一维数组的创建和初始化

2.1数组的创建

一维数组创建的格式如下:

type arr_name[常量值];

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。

  • type 指定的是数组中存放的数据的类型,可以是 char、int、short、float 等等,也可以是自定义的类型。
  • arr_name 指的是数组名的名字,这个名字根据实际的情况,有意义就行。
  • [ ] 中的常量值是用来指定数组的大小,这个数组的大小是根据实际的需求指定就行。

如果我们要存放20个人的数学成绩,就可以创建这样一个数组:

int math[20];

同样,也可以创建其他类型和大小的数组:

char ch[5];

float score[32];

2.2数组的初始化

创建数组的同时我们可以给数组里面的一些数据赋值,这种就被称为初始化。

如何给数组初始化呢?数组的初始化一般使用大括号 { },将初始化的数据放在大括号中 

//完全初始化int arr1[5]={1,2,3,4,5};//不完全初始化int arr2[5]={ 0 };//错误的初始化 —— 初始化的项太多int arr3[3]={1,2,3,4,5};

2.3数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名剩下的就是数组的类型。

int arr1[10];

char arr2[5];

float arr3[6];

注意:

arr1数组的类型是:int [10]

arr2数组的类型是:char [5]

arr3数组的类型是:float [6]

而在 [ ] 前面的 int、char、float 是 [ ] 中元素的类型

3.一维数组的使用

一维数组可以存放数据,存放数据的目的是对数据的操作。

3.1数组的下标

C语言规定数组是有下标的,下标是从 0 开始的,如果数组有 n 个元素,那么最后一个元素的下标就是 n-1 ,下标就相当于是数组元素的编号:

在C语言中数组的访问提供了一个操作符 [ ] ,这个操作符叫:下标引用操作符

有了下标访问操作符,就可以轻松的访问到数组的元素了,如果我们访问下标为5的元素,我们就是用 arr[5],想访问下标是 3 的元素,就可以使用 arr[3],代码如下:

#include <stdio.h>int main(){int arr[10]={1,2,3,4,5,6,7,8,9,10};printf("%d\n",arr[5]); //6printf("%d\n",arr[3]); //4return 0;
}

3.2数组元素的打印

当我们想要访问整个数组元素时,只要产生数组元素的下标就可以了,我们用 for 循环产生 0-9 的下标,使用下标访问就可以了:

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//完全初始化
//                  0 1 2 3 4 5 6 7 8 9int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

 

3.3数组的输入

当我们想要给数组输入想要的数据又如何操作呢?

int main()
{int arr1[10] = { 0 };int i = 0;for (i = 0; i < 10; i++){scanf("%d", &arr1[i]);}for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

 

4.一维数组在内存中存储

一依次打印数组元素的地址:

//数组在内存中的存储
int main()
{int arr[10] = { 0 };int i = 0;for (i = 0; i < 10; i++){//&--取地址//%p--打印地址//编号==地址==C语言中的指针printf("&arr[%d]=%p\n",i, &arr[i]);}return 0;
}

 

从上面的输出的结果我们就可以发现随着下标的增长,地址也是由小到大的变化,观察到每两个相邻的元素之间相差4,这是因为元素类型是 int 。可以得出结论:数组在内存中是连续存放的。

5.sizeof计算数组元素个数

在C语言中是有计算数组元素个数的关键字:sizeof

sizeof 在C语言中是一个关键字,是可以计算类型或者是变量的大小的,同样 sizeof也可以计算数组的大小。

代码如下:

int main()
{int arr[10] = { 0 };int i = 0;printf("%d\n", sizeof(arr));//整个数组的大小,单位是字节printf("%d\n", sizeof(arr[i]));//数组中的一个元素的大小int sz = sizeof(arr) / sizeof(arr[i]);//计算数组中的元素个数printf("%d\n", sz);return 0;
}

结果输出的是 : 40 ,这里计算的是数组所含内存空间的大小,单位是 :字节

从上面的代码我们也可以知道:当知道一个元素的所占字节的大小,那么数组的元素个数就能算出来了。

6.二维数组的创建

6.1 二维数组的概念

当我们把一维数组作为新的数组元素时,这时候就会构成二维数组。以此类推,当我们把二维数组作为新的数组的元素时,就会构成三维数组,二维数组以上的数组被称为多维数组。

6.2二维数组的创建

二维数组的格式如下:

type arr_name[常量值1][常量值2]; 

例如:

int arr1[3] [5];

  • 3表示数组有3行
  • 5表示数组每一行有5个元素<==>有5列 
  • int 表示数组的每个元素类型是整型类型
  • arr是数组名,可以根据自己的需求来命名

7.二维数组的初始化

同一维数组一样,也是用大括号来初始化。

7.1不完全初始化

int arr1[3][5]={1,2,3};

int arr2[3][5]={0};

 

7.2完全初始化

int arr3[3] [5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};

 

7.3按照行初始化

int arr4[3][5]={{1,2},{3,4},{5,6,7}}; 

 

7.4初始化时可以省略行,但是不能省略列

int arr5[ ][5]={1,2,3};

int arr6[ ][5]={1,2,3,4,5,6,7,8} ;

int arr7[ ][5]={{1,2},{3,4},{5,6,7,8}} ;

8.二维数组的使用

8.1二维数组的输入和输出

用两个 for 分别来控制列和行的输入,列嵌在行里面,代码如下:

int main()
{int arr[3][5] = { 0 };int i = 0;//遍历⾏//输⼊for (i = 0; i < 3; i++) //产⽣⾏号{int j = 0;for (j = 0; j < 5; j++) //产⽣列号{scanf("%d", &arr[i][j]); //输⼊数据}}//输出for (i = 0; i < 3; i++) //产⽣⾏号{int j = 0;for (j = 0; j < 5; j++) //产⽣列号{printf("%d ", arr[i][j]); //输出数据}printf("\n");}return 0;
}

9.二维数组的在内存中的存储

同一维数组一样如果想要研究内存中的存储方式,我们也可以打印数组所有元素的地址。代码如下:

int main()
{int arr[3][5] = { 0 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("&arr[%d][%d]=%p\n", i, j, &arr[i][j]);}}

 

从输出的结果我们可以看见每两个相邻的地址之间相差4个字节,当然跨行位置处的两个元素同样也是,所以二维数组中的每个元素都是连续存放的

10.数组的练习

练习一:多个字符从两端移动,向中间汇集

//练习1 多个字符从两端移动,向中间汇聚
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#include<stdio.h>
int main() {char arr1[] = "welcome to bit!!!!!!";char arr2[] = "####################";int left = 0;int right = strlen(arr1) - 1;while (left<=right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n",arr2);Sleep(1000);system("cls");left++;right--;}printf("%s\n", arr2);return 0;
}

练习二:二分查找

注意:

二分查找的唯一一个要求就是:数组是有顺序的

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d", &k);int sz = sizeof(arr)/ sizeof(arr[0]);int left = 0;int right = sz - 1;while (left <= right){int mid = (right + left) / 2;if (arr[mid] == k){printf("找到了,下标是%d\n",mid);break;}else if (arr[mid] < k){left = mid + 1;}else {right = mid - 1;}}//跳出循环if (left > right){printf("找不到\n");}return 0;
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d", &k);int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;int right = sz - 1;int flag = 0;while (left <= right){int mid = (right + left) / 2;if (arr[mid] == k){printf("找到了,下标是%d\n", mid);flag = 1;break;}else if (arr[mid] < k){left = mid + 1;}else {right = mid - 1;}}//跳出循环if (flag==0){printf("找不到\n");}return 0;
}

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

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

相关文章

蓝桥杯 17110抓娃娃

问题描述 小明拿了 n 条线段练习抓娃娃。他将所有线段铺在数轴上&#xff0c;第 i 条线段的左端点在 li&#xff0c;右端点在 ri​。小明用 m 个区间去框这些线段&#xff0c;第 i个区间的范围是 [Li​, Ri​]。如果一个线段有 至少一半 的长度被包含在某个区间内&#xff0c;…

linux ptrace 图文详解(二) PTRACE_TRACEME 跟踪程序

目录 一、基础介绍 二、PTRACE_TRACE 实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 一、基础介绍 GDB&#xff08;GNU Debugger&…

记录致远OA服务器硬盘升级过程

前言 日常使用中OA系统突然卡死&#xff0c;刷新访问进不去系统&#xff0c;ping服务器地址正常&#xff0c;立马登录服务器检查&#xff0c;一看磁盘爆了。 我大脑直接萎缩了&#xff0c;谁家OA系统配400G的空间啊&#xff0c;过我手的服务器没有50也是30台&#xff0c;还是…

电网电压暂态扰动机理与工业设备抗失压防护策略研究

什么是晃电&#xff1f; 国标GB/T 30137-2013 中定义:工频电压方均根值突然降至额定值的90%~10%&#xff0c;持续时间为10ms~1min后恢复正常的现象。Acrel8757V 晃电的原因 1.系统侧因素 短路故障&#xff1a;雷击、线路接地、设备误碰等导致电网短路&#xff0c;故障点电压…

Linux监控网络状态

一、基本介绍 1、基本语法 netstat [选项] 2、常用选项 选项 说明 -a 显示所有连接和监听的套接字&#xff08;包括TCP、UDP&#xff09;。 -t 显示 TCP 连接。 -u 显示 UDP 连接。 -l 显示正在监听的套接字&#xff08;server端&#xff09;。 -n 显示数字格式的…

UE5以插件的形式加载第三方库

之前在UE中加载第三方库的形式是以静态或者动态链接的形式加载但是不太容易复用。就想着能不能以插件的形式加载第三方库&#xff0c;这样直接把插件打包发行就可以复用了&#xff0c;之前也找过相应的教程但是很难找到比较简单易懂的教程&#xff0c;要么是比较复杂&#xff0…

Go执行当前package下的所有方法

需求&#xff1a;需要一个文件一个定时任务方法&#xff0c;当项目初始化完毕后&#xff0c;自动加载并执行这些定时任务方法 项目目录架构 main.go 初始化 package mainimport ("sql_demo/schedule" )func main() {/***** 其他初始化完毕后的操作**/// 定时任务sc…

AnyAnomaly: 基于大型视觉语言模型的零样本可定制视频异常检测

文章目录 速览摘要1. 引言2. 相关工作视频异常检测大型视觉语言模型&#xff08;LVLMs&#xff09; 3. 方法3.1. 总览3.2. 关键帧选择模块3.3. 上下文生成基于 WinCLIP 的注意力机制网格图像生成 3.4. 异常检测提示词设计异常评分 4. 实验4.1. 数据集4.2. 评估标准4.3. 结果4.4…

【AWS入门】2025 AWS亚马逊云科技账户注册指南

【AWS入门】2025 AWS亚马逊云科技账户注册指南 A Guide To Register a New account on AWS By JacksonML 0. AWS亚马逊云科技简介 Amazon Web Service(AWS) 即亚马逊云科技&#xff0c;其在全球Cloud Computing(云计算)市场占有最为重要的地位。 AWS连续13年被Gartner评为…

Spring 中 SmartInitializingSingleton 的作用和示例

一、 接口定义 SmartInitializingSingleton 是 Spring 框架提供的一个 单例 Bean 全局初始化回调接口&#xff0c;用于在 所有非延迟单例 Bean 初始化完成后 执行自定义逻辑。 核心方法&#xff1a; public interface SmartInitializingSingleton {void afterSingletonsInsta…

element tree树形结构默认展开全部

背景&#xff1a; el-tree树形结构&#xff0c;默认展开全部&#xff0c;使用属性default-expand-all【是否默认展开所有节点】&#xff1b;默认展开一级&#xff0c;设置default-expanded-keys【默认展开的节点的 key 的数组】属性值为数组。 因为我这里的数据第一级是四川【省…

大数据-spark3.5安装部署之local模式

spark&#xff0c;一个数据处理框架和计算引擎。 下载 local模式即本地模式&#xff0c;就是不需要任何其他节点资源就可以在本地执行spark代码的环境。用于练习演示。 上传解压 使用PortX将文件上传至/opt 进入/opt目录&#xff0c;创建目录module&#xff0c;解压文件至/o…

Discuz建站教程之论坛头部logo跳转链接怎么修改?

在修改头部logo跳转链接前&#xff0c;我们需要知道对应代码在哪个文件目录&#xff0c;进入宝塔或是服务器&#xff0c;找到文件&#xff1a;\template\default\common\header.htm&#xff0c;编辑器打开&#xff0c;搜索以下代码&#xff0c;大概在135行 <a href"{i…

【FreeRTOS】FreeRTOS操作系统在嵌入式单片机上裸机移植

目录 一 RTOS概述 二 FreeRTOS移植 三 FreeRTOS使用 四 附录 一 RTOS概述 先了解一些基础概念,以下内容摘自FreeRTOS官网(FreeRTOS™ - FreeRTOS™): 【1】RTOS基础知识 实时操作系统 (RTOS) 是一种体积小巧、确定性强的计算机操作系统。 RTOS 通常用于需要在严格时间限…

编译支持 RKmpp 和 RGA 的 ffmpeg 源码

一、前言 RK3588 支持VPU硬件解码&#xff0c;需要rkmpp进行调用&#xff1b;支持2D图像加速&#xff0c;需要 RGA 进行调用。 这两个库均能通过 ffmpeg-rockchip 进行间接调用&#xff0c;编译时需要开启对应的功能。 二、依赖安装 编译ffmpeg前需要编译 rkmpp 和 RGA&#xf…

深度学习基础:线性代数本质2——线性组合、张成的空间与基

目录 一、线性组合 1. 用一个有趣的角度看向量坐标 2. 如果我们选择不同的基向量会怎样&#xff1f; 3. 线性组合 4. 张成的空间 ① 二维向量的张成的空间 ② 三维向量的张成的空间​编辑 5.线性相关 6.线性无关 7. 基的定义 一、线性组合 1. 用一个有趣的角度看向量坐…

openharmony5.0中HDF驱动框架源码梳理-服务管理接口

要想大概了解一个公司&#xff0c;我们可能只需要知道它的运行逻辑即可&#xff0c;例如我们只需要知道它有财务有研发有运营等&#xff0c;财务报销、研发负责产品等即可&#xff0c;但是如果想深入具体的了解的话我们就要了解都有什么部门(对象)、各部门都包含哪些职责(对象方…

Go语言环境搭建并执行第一个Go程序

目录 一、Windows环境搭建 二、vscode安装插件 三、运行第一个go程序 一、Windows环境搭建 下载Go&#xff1a;All releases - The Go Programming Language 这里是Windows搭建&#xff0c;选择的是windows-amd64.msi&#xff0c;也可以选择zip直接解压缩到指定目录 选择msi…

Netty基础—4.NIO的使用简介一

大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9.NIO优点总结 10.NIO问题总结 1.Buffer缓冲区 (1)Buffer缓冲区的作用 (2)Buffer缓冲区的4个核心概念 (3)使…

linux 命令 tail

tail 是 Linux 中用于查看文件末尾内容的命令&#xff0c;常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项&#xff1a; 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行&#xff08;…