C语言之数组

1. 数组的概念

数组是⼀组相同类型元素的集合

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

数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。

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

数组创建

⼀维数组创建的基本语法:

type arr_name[常量值];

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

  • type指定的是数组中存放数据的类型,可以是:char、short、int、float等,也可以自定义的类型
  • arr_name指的是数组名的名字,这个名字根据实际情况,起的有意义就行。
  • []中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行
例子
  1. 想存储某个班级的20人的数学成绩,就可以创建一个数组

int math[20];

  1. 可以根据需求其他类型和大小的数组
  1. char ch[8];
  2. double score[10]
数组的初始化

有的时候,数组在创建的时候,我们需要给定一些初始值,这种称为初始化

在这里插入代码片int main()
{
	//完全初识化
	int arr[5] = { 1,2,3,4,5 };

	//不完全初始化
	int arr2[6] = { 1 };	//第一个元素初始化为1,剩余的元素默认初始化为0

	//错误的初识化 - 初始化项太多
	int arr3[3] = { 1,2,3,4 };

	return 0;
}
数组的类型

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

  1. int arr1[10];
  2. int arr2[12];
  3. char ch[5];

arr1数组的类型是int [10]
arr2数组的类型是int [12]
ch数组的类型是char [5]

3. ⼀维数组的使⽤

数组的下标

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素。最后一个元素的下标是n-1,下标就相当于数组元素的下标

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

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

有了下标访问操作符,我们就可以很轻松的访问到数组的元素了

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", arr[7]);	//8
	printf("%d\n", arr[3]); //4

	return 0; 
}
数组元素的打印

接下来,如果想要访问整个数组的内容,应该如何呢?
只要我们产生数组所有元素的下标就可以了,使用for循环产生0~9的下标,接下来使用下标访问就行了。

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

	return 0;
}
数组的输入

当我们明白了数组的访问,当然我们也根据需求,自己给数组输入想要的数据

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

4. ⼀维数组在内存中的存储

有了前面的知识,我们其实使用数组基本没有什么障碍了,如果我们要深入廖俊杰数组,最好能了解一下数组在内存中的存储。

依次打印数组元素地址
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("&arr[%d]%p\n",i, &arr[i]);
	}
	return 0;
}

在这里插入图片描述

分析:
从输出的结果来看,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)

结论:
数组在内存中是连续存放的

在这里插入图片描述

5. sizeof计算数组元素个数

在遍历数组的时候,我们经常想要知道数组的元素格式,可以使用sizeof得出。

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

例子
int main()
{
	int arr[10] = { 0 };
	printf("%d", sizeof(arr));//40
	return 0;
}

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

我们又知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占自己的个数,数组的元素个数就能算出来。

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

接下来就能计算出数组的元素个数:

int main()
{
	int arr[10] = { 0 };
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d", sz);

	return 0;
}

这里的结果是:10,表示数组有10个元素。
以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组如何变化,计算出的大小也就随着变化了。

6. ⼆维数组的创建

概念

前面学习的数组被称为一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多组数组

在这里插入图片描述

创建

如何定义二维数组:

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

例子
int main()
{
	int arr[3][5];
	double data[2][8];
}

解释:上述代码的信息

  • 3表示数组有3行
  • 5表示每一行有5个元素
  • int 表示数组的每个元素是整型类型的
  • arr是数组名,可以根据自己的需求指定名字data数组意思基本一致

7. ⼆维数组的初始化

不完全初始化
int main()
{
	int arr1[3][5] = { 1,2 };
	int arr2[3][5] = { 0 };
	return 0;
}

在这里插入图片描述

完全初始化
int main()
{
	int arr3[3][5] = { 1,2,3,4,5,  2,3,4,5,6,  3,4,5,6,7 };
	return 0;
}

在这里插入图片描述

按照行初始化
int main()
{
	int arr4[3][5] = { { 1,2 },{3,4},{5,6} };
	return 0;
}

在这里插入图片描述

初始化时省略行,但是不能省略列
int main()
{
	int arr5[][5] = {  1,2 ,3 };
	int arr6[][5] = { 1,2,3,4,5,6,7 };
	int arr7[][5] = { {1,2},{3,4},{5,6} };
	return 0;
}

在这里插入图片描述

8. ⼆维数组的使⽤

二维数组的下标

当我们掌握了二维数组的创建和初始化,那又如何使用二维数组呢?

其实二维数组的访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素。

C语言规定,二维数组的行是从0开始的,列也是从0开始的:

int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	return 0;
}

在这里插入图片描述

图中最右侧绿色的十字表示行号,第一行蓝色的数字表示列号,都是从0开始的。

int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	printf("%d", arr[2][4]);	//7
	return 0;
}
二维数组的输入和输出
int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	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]);
		}
	}
	return 0;
}

在这里插入图片描述

从输出结果来看,每一行内部的元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素,所以二维数组中的每个元素都是连续存放的。

在这里插入图片描述

10. C99中的变⻓数组

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式、或者如果我们初始化数据的话,可以省略数组大小。

int main()
{
	int arr1[10];
	int arr2[3 + 5];
	int arr3[] = { 1,2,3 };

	return 0;
}

这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组小了又不够用的。

C99中给一个变长数组的新特性,允许我们可以使用比那辆指定数组大小

 1.int n = a+b;
 2.int arr[n];

11. 数组练习

练习1:多个字符从两端移动,向中间汇聚
int main()
{
	char arr1[] = "#################";
	char arr2[] = "welcome to bit...";
	int left = 0;
	int right = strlen(arr2) - 1;
	printf("%s\n", arr1);

	while (left <= right)
	{
		arr1[left] = arr2[left];
		arr1[right] = arr2[right];
		left++;
		right--;
		printf("%s\n", arr1);
	}
	return 0;

}

在这里插入图片描述

练习2:⼆分查找
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int key = 0;
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0])-1;
	int middle = 0;
	int find = 0;
	scanf("%d", &key);
	
	while (left <= right)
	{
		middle = (left + right) / 2;
		if (arr[middle] >key )
		{
			right = middle - 1;
		}
		else if (arr[middle] < key)
		{
			left = middle + 1;
		}
		else {
			find = 1;
			break;

		}
	}
	if (find == 1) {
		printf("找到了下标为%d", middle);
	}
	else {
		printf("找不到");
	}


	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值