目录

数组的介绍

数组的介绍

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 ,下标就相当于是数组元素的编号:

https://i-blog.csdnimg.cn/direct/417e1147bb3642e3afe5d23327e99f66.png

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

https://i-blog.csdnimg.cn/direct/361030f132c9421d968168065d669c6d.png

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

https://i-blog.csdnimg.cn/direct/3f7313a9b41f4e7ea603937a8dd299e1.png

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

https://i-blog.csdnimg.cn/direct/139a747fe54f47c9ba4d85bcec187393.png

从上面的输出的结果我们就可以发现随着下标的增长,地址也是由小到大的变化,观察到每两个相邻的元素之间相差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;
}

https://i-blog.csdnimg.cn/direct/b02870cb57784139a8531b0849ce6e17.png

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

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

6.二维数组的创建

6.1 二维数组的概念

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

https://i-blog.csdnimg.cn/direct/94a50ec732f242cab477fcdb0352a662.png

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

https://i-blog.csdnimg.cn/direct/e4f09cecf5ed4e6aad4ef975882fbc1b.png

7.2完全初始化

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

https://i-blog.csdnimg.cn/direct/199188d9c9fa4a08b4635960d6b8d83f.png

7.3按照行初始化

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

https://i-blog.csdnimg.cn/direct/515db3ceb34b4cd49924763c59d97ed7.png

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

https://i-blog.csdnimg.cn/direct/bb70432a89d84b17acfa8aa2f80c7a77.png

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

https://i-blog.csdnimg.cn/direct/32d3cab40646419a83ee64be618d3e88.png

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

	}

https://i-blog.csdnimg.cn/direct/ccfc7a451dc64181921e300af2255abe.png

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

https://i-blog.csdnimg.cn/direct/1ec5fadc1e1042ea987c4eed9858a792.png

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