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

数组的介绍

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]); //6

printf("%d\n",arr[3]); //4


return 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 9
	int 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;
}

相关文章:

  • ios 小组件和数据共享
  • 浅谈StarRocks数据库简介及应用
  • 插入排序算法的SIMD优化
  • 地下停车场调频广播覆盖:破解地下车库无线广播收听孤岛,技术赋能地下停车场FM调频无线广播覆盖
  • PixelCNN:基于自回归的图像生成模型及其数学原理
  • spring boot3 kafka集群搭建到使用
  • AI大模型测试用例生成平台
  • mysql 到 doris 挪移数据
  • IDEA中链接使用mysql数据库
  • 如何在 React 中实现错误边界?
  • 一场因黄焖鸡引发的技术方案大作战
  • js版本之ES12(2021)、ES13(2022)新特性(九)
  • 封装Axios拦截器实现用户无感刷新AccessToken实践指南
  • 简单创建一个Django项目并配置neo4j数据库
  • Scratch 3.0安装包,支持Win7/10/11、Mac电脑手机平板、少儿便编程的启蒙软件。
  • SQL99 多表查询
  • 成功破解加密机制,研究人员解锁LinuxESXi Akira勒索软件
  • 单片机技术
  • C++复试笔记(三)
  • flutter实践:断点调试踩坑
  • 科泉网站/百度的合作网站有哪些
  • 做简易网站/怎样做网站
  • 湖南网站推广多少钱/足球排名最新排名世界
  • 济南网站推广公司/谷歌搜索引擎为什么国内用不了
  • 百度网站结构/seo推广排名平台有哪些
  • 网站建设方案撰写/上海百度seo牛巨微