数组的介绍

ops/2025/3/15 20:43:51/

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.ppmy.cn/ops/166037.html

相关文章

大模型微调中warmup(学习率预热)是什么

大模型微调中warmup(学习率预热)是什么 在大模型微调中,添加warmup(学习率预热)是指在训练初期逐步增加学习率,避免直接使用高学习率导致参数震荡。 🔧 为什么需要warmup? 大模型参数敏感:预训练模型的参数已接近最优,初期用大学习率可能剧烈扰动参数(如“急刹车…

3.JVM-内部结构

1.栈结构 1.1 动态链接 栈中的对象指向堆中的实际引用 符号引用: 比如一个类的名称 直接引用: 具体堆中数据信息 1.2 方法返回 栈中上一层的结果和下一层的指令 1.3 操作数栈 1.4 局部变量 该线程中需要的变量 2. 虚拟机栈是如何工作 程序计数器:存当前执行到那一步 操作…

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器&#xff0c;用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂&#xff0c;但通过手写一个简易版的 Tomcat&#xff0c;我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat&#xff0c;并深…

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…

3.angular表单验证

更多用法参考&#xff1a;https://www.jb51.net/article/97552.htm $valid/$invalid // 表单验证通过/表单验证不通过, true/false$pristine/$dirty // 表单验证值是否是初始值 $pristine 初始值, $dirty就是只要改变就为true$error // 验证信息 有错误的才展示里面true 上面…

MySQL Binlog的样式

一、Binlog 的基本概念与记录内容 Binlog 是 MySQL 的二进制日志&#xff0c;以事件形式记录所有对数据库的修改操作&#xff0c;包括&#xff1a; DDL 操作&#xff1a;如 CREATE、ALTER、DROP 等表结构变更。DML 操作&#xff1a;如 INSERT、UPDATE、DELETE 等数据修改。事…

Webpack 打包详细教程

Webpack 是一个现代 JavaScript 应用的静态模块打包工具&#xff0c;它可以处理 JavaScript、CSS、图片等资源&#xff0c;并优化它们以提高性能。以下是 Webpack 从基础到进阶的详细教程。 1. Webpack 基础概念 Webpack 的核心概念包括&#xff1a; Entry&#xff08;入口&a…

基于Asp.net的医院病历管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…