7、C语言 数组

为什么要使用数组

在编程过程中,经常遇到一个问题是:如何处理类型一致的大量数据。如存储100名学生的成绩,这需要定义一百个变量。对于这类问题可以用数组解决,数组是一组相同类型数据的有序集合。

什么是数组

  • 数组是一个存储相同类型数据的有序集合。
  • 每一个数据称为数组元素,这些数组元素有一个共同的名字称为数组名。
  • 不同元素由其在数组中的序号(下标)来标识。
  • C语言中下标从0开始计数。
  • 用一个下标确定元素的数组称为以为数组,用两个下标来确定元素的数组称为二维数组。

一维数组

C语言中,变量需要先定义后使用,数组也一样,在数用数组前需要先定义。
数组定义的主要目的是确定数组的名称,数组大小和数组的类型。
一维数组的定义
一维数组的定义一般形式如下。
类型说明符 数组名 [常量表达式];
类型说明符:声明数组数据类型,同一数组所有元素的类型相同。
数组名:是一个类型标识符,命名要符合标识符命名规范。
常量表达式:必须用方括号括起来,常量表达式表示数组元素的个数。
数组定义后,C语言编译系统就在内存中为数组分配一个连续的存储空间,用来依次存放数组中各元素的值。

int a[10];//定义一个名字为a的int类型的数组,数组中有10个元素,数组下标0~9。

表示定义了一个int类型的数组,数组名为a,这个数组一共有10个元素,分别是a[0],a[1],a[2],a[3],a[4].a[5].a[6].a[7],a[8],a[9]。
每一个元素可以表示一个int类型的数据,C语言编译器会在内从中为int类型的数组a分配10*4字节的连续空间(int类型占4个字节),作为这10个元素的存储区域,数组名a表示这一片连续存储空间的开始地址。

一维数组的引用
数组定义后,就可以在程序中使用了,数组的每个元素相当于一个变量,对数组的引用就是引用数组的下标。

引用方式:
数组名 [下标]

	int b[100];
 	b[0]=5;//第一个元素赋值为5
 	b[3]=8;//第4个元素赋值为8
 	//因为下标从0开始,所以下标+1才是第几个元素

输入十个数,存到数组中并输出

	int a[10];
	for(int i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
		//第一次输入的数储存到a[0]中,第二次输入的数存到a[1]中...第十次输入的数存到a[9]中 
	}
	for(int i=0;i<10;i++)
	{
	//从a[0]输出一致输出到a[9]
		printf("%d ",a[i]);
	}
	//倒序输出
	for(int i=9;i>=0;i--)
	{
	//从a[9]输出一致输出到a[0]
		printf("%d ",a[i]);
	}

注意下标是从0开始,所以最大元素下标是数组长度-1。
下标可以是整型常量,算数表达式还可以是整型变量。

	int a=1;
 	int b[100];
 	b[0]=5;
 	b[a]=4;
 	b[a+1]=3;
 	b[2+1]=2;
 	printf("%d %d %d %d\n",b[0],b[1],b[2],b[3]);

在这里插入图片描述
下标是n就代表这是第n+1个元素。
一维数组的初始化
初始化就是定义数组的时候给数组赋值,可以给全部数组赋值,也可以给部分数组赋值,为赋值的元素自动复赋值为0。

	int a=1;
 	int b[10]={1,2,3,4,5,6,7,8,9,10};//为全部元素赋值
	int c[10]={1,2,3,4,5};//只给前5个元素赋值,后5个元素自动赋值为0 

排序
冒泡排序

	int a[10]={9,8,6,7,2,10,16,4,1,5};
	for(int i=0;i<10;i++)
	{
		for(int j=1;j<10;j++)
		{//每一次都这个元素跟它前一个元素比较(也可以拿当前元素和后一个比较)
		//a[0]元素前没有元素所以第一次要拿第二个元素也就是a[1]
		//弱国拿当前元素和后一个元素比较,j的初始值为0;j<10-1;
			if(a[j]<a[j-1])
			{//这个元素比它前一个元素小就交换这两个元素
				int e;
				e=a[j];
				a[j]=a[j-1];
				a[j-1]=e;
			}
		}
		//内层for循环第一次执行后最大的元素放在最后
		//内层for循环第二次执行后最大的元素放在倒数第二的位置
	} 

选择排序

#include"stdio.h"

int main()
{
	int a;
 	int b[10]={9,3,5,7,4,2,8,6,1,12};
 	//从小到大排序
 	for(int i=1;i<10;i++)
 	{
 		//内层for循环每次都判断0到i-1的区间有没有比b[i]大的数,如果有它和b[i]进行交换。(保证b[0]到b[i-1]这个区间没有比b[i]大的数)
 		for(int j=0;j<i;j++)
 		{
 			if(b[j]>b[i])//判断b[0]到b[i-1]有没有比b[i]大的数
 			{//如果是从大到小排序b[j]<b[i],保证b[0]到b[i-1]没有比b[i]小的数
 				a=b[j];
 				b[j]=b[i];
 				b[i]=a;
			}
		}
		
	}
}

二维数组

一维数组只有一行,二维数组有多行。
一维数组有多个相同类型的变量,二维数组有多个相同类型的一维数组。你可以把数组看成表格或一个矩阵,一维数组只有一行多列,二维数组有多行多列。

二维数组的定义
二维数组的定义形式如下:
数据类型 数组名 [常量表达式] [常量表达式2]
常量表达式1:二维数组的第一维,表示这个数组有几行。
常量表达式2:二维数组的第二维,表示这个数组有几列。

int a[10][10];//定义一个int类型的二维数组,数组大小是10行10列,共10个元素。

二维数组中的元素分别是[0][0],a[0][1],a[0][2]…a[0][9],a[1][0],a[1][1],a[1][2]…a[9][9]。一维的下标和二维的下标都不能超过定义时的范围。a[10][10]一维的下标在0 ~ 9之间,二维的下标也在0 ~ 9之间。分别表示第一行第一个元素,第一行第二个元素,第一行第三个元素…第十行第十个元素(a[9][9])

//	a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]......a[0][9]
//	a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]......a[1][9]
//	a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]......a[2][9]
//	.
//	.
//	.
//	a[9][0] a[9][1] a[9][2] a[9][3] a[9][4]......a[9][9]

二维数组的引用
二位数组的引用格式:
数组名 [一维下标][二维下标]

	int a[10][10];
	a[0][0]=5;//第一行第一个元素赋值为5
	a[1][3]=6;//第二行第4个元素赋值为6;
	//与一维数组相同二维数组的下标都是从0开始,第一位和第二维下标都要加1才是第几行第几个元素。

二维数组的赋值和输出
二维数组赋值和输出使用双层for循环,外层for循环表示给第几行,内层for循环表示这行的第几个元素。

	int a[10][10];
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			a[i][j]=i+j; 
		}
	} 
	int a[10][10];
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	} 

二维数组的初始化
为二维数组所有元素初始化

	int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
	//大括号中的每个大括号是表示数组的第几维(就是第几行),
	//大括号中的每个数表示为第二位的第几个数赋值(第几行第几个数赋值)
	int b[3][3]={1,2,3,4,5,6,7,8,9};//
	//也可以用一个大括号为所有元素赋值,大括号中的数会按照第一行第一个元素,第一行第二个元素第一行第三个元素,第二行第一个元素......第三行第三个元素的顺序赋值。
	//先为第一行所有元素赋值,然后为第二行的所有元素赋值....。一直到最后一个数赋值给最后一行最后一个元素。	

为二维数组部分元素初始化

	int a[10][10]={{1,2,3},{4,5},{7,8,9,15}};
	//分别为第一行的前三个元素赋值,第二行的前两个元素赋值,第3行的前四个元素赋值。其余元素为0。
	int b[10][10]={1,2,5,4};
	//因为只有4个数,所以赋值时只有第一行前4个数被赋值,其余元素为0.
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值