C语言--数组

引入

我们为什么会用到数组呢,设想一下,如果我们输入一组分数,然后计算平均数,最后输出在平均分以下的人的分数。当然,平均分数我们可以通过一个简单的循环算出,但在算出平均分数之后,我们又要去哪找到符合题意的分数并输出呢?这时我们的数组就可以大显身手了,用数组将所有分数储存,最后在输出符合条件的分数就大功告成啦!当然,这只是理论上的,那我们话不多说,现在就开始学习数组吧。

数组的概念

数组是一类相同元素的集合,也就是说在同一数组中的元素是同一种类型的,可能是整型,字符型或者其他类型(这就好比住在女生宿舍中的是同一类型--的都是女生嘛)。

于是,从这个概念中我们可以知道

(1)数组中存放的是一个或多个数据,但数组中的元素个数不能为零

(2)数组中存放的数据类型是相同的

数组的分类

数组分为一维数组和二维数组

那我们就循序渐近,先从一维数组开始了解吧

一维数组

一维数组的创建

类型名  数组名  【表示数组大小的常量值】

比如说我创建的数组是   int   student  【100】

(1)类型名指的是数组中存放元素的类型,可以是:char、short、int、float等等,当然也可以是自定义类型。

(2)数组名即为数组的名字,可以根据实际情况自己确定

(3)【】中的常量值是用来指定数组的大小的,需要注意的是大小要根据实际情况而定,不然会出现数组越界或者其他不可预料的情况

一维数组的初始化

何为初始化?在数组创建时,我们所给定的一些初始值,这样的操作就叫做数组的初始化

如何初始化?哦我们在数组的初始化时一般用大括号,将初始化的数据放在大括号里

而一维数组的初始化分为完全初始化和不完全初始化

同时,在一维数组创建时,【】中的常量值可以省去,如果省去,则数组中的元素个数即为初始化的个数 

数组的类型

数组算是一种自定义类型,去掉数组名后就是数组的类型。

例如 int  student  【100】

student数组的类型是int  【100】

一维数组的使用

一维数组的下标

在C语言的规定中。数组的下标是从0开始的。就比如说数组有n个元素,那么最后一个元素的下标就是n-1。

例如数组 int  a 【5】={1,2,3,4,5};

数组12345
下标01234

因此C语言提供了一种操作符---【】(下标引用操作符)

通过下标引用操作符,我们就可以访问数组中的元素了

数组元素的输入和输出

数组中不止有一个元素,那么我们如何将所有数据存入到数组当中去并打印出来呢?

其实通过一个简单的循环就可以了啦

                                  

​
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[5] = { 1,2,3,4,5 };
	// 现在我们要把6,7.8,9,10存入数组当中
	int i = 0;
	for (i = 0;i < 5;i++) {
		scanf("%d", &a[i]);
	}
	for (i = 0;i < 5;i++) {
		printf("%d ", a[i]);
	}
	return 0;
}

​

类型

一维数组在内存中的储存

我们现在通过依次打印数组中个元素的地址来逐步了解

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[5] = { 1,2,3,4,5 };
	                                
	int i = 0;
	for (i = 0;i < 5;i++) {
		printf("&a[%d]=%p\n", i, &a[i]);
	}
	return 0;
}

数组随着下标的增长,地址是从小到大变化的,并且相邻的元素之间相差4(一个整型是4个字节)。由此我们可以得出结论:数组在内存中是连续存放的。

利用sizeof计算数组元素的个数

step  1:用sizeof算出数组所占内存空间的总大小

step  2:数组总大小/一个元素的大小

这是因为数组中所有元素的类型是相同,那只要能计算出一个元素所占字节的个数,数组的元素个数就能算出来了

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[5] = { 1,2,3,4,5 };
	int b = sizeof(a) / sizeof(a[0]);
	printf("%d", b);

	return 0;
}

二维数组

二维数组的概念

我们可以把二维数组看作由一维数组组成的数组

创建二维数组

类型名   数组名  【常量值1】【常量值2】

例如:

int  arr  【3】【5】

(1)3表示数组有三行

(2)5表示每一行有五个元素

(3)int表示数组中每一个元素都是整型类型

二维数组的初始化

(1)不完全初始化

int a  【3】【3】={1,2};

120
000
000

以上是初始化后数组中元素的值

(2)完全初始化

int  a  【3】【3】={{1,2,3},{4,5,6},{7,8,9}};

int  a  【3】【3】={1,2,3,4,5,6,7,8,9};

以上两种初始化方式均正确,第一种是按照行来初始化的

123
456
789

需要注意的是

二维数组初始化是,行可以省略,但是列不可以省略。因为二维数组是连续存放的 ,如果一开始没有规定列的大小,我们甚至都不清楚第一行什么时候能够放满元素,就无法知道数组的大小。

二维数组的下标,无论是行还是列,下标都是从零开始的。

二维数组的输入和输出

上面我们已经知道了一维数组的输入和输出是由循环实现的,二维数组同样是如此,不过是使用的嵌套循环,首先是行,然后是列

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[3][3];
	int i = 0, j = 0;
	for (i = 0;i < 3;i++) {//产生行号
		for (j = 0;j < 3;j++) {//产生列号
			scanf("%d", &a[i][j]);
		}
	}
	for (i = 0;i < 3;i++) {
		for (j = 0;j < 3;j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");//一行输出完后换行
	}
	return 0;
}

                                                                                                                                                                 

二维数组在内存中的储存

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[3][3];
	int i = 0, j = 0;
	for (i = 0;i < 3;i++) {//产生行号
		for (j = 0;j < 3;j++) {//产生列号
			scanf("%d", &a[i][j]);
		}
	}
	for (i = 0;i < 3;i++) {
		for (j = 0;j < 3;j++) {
			printf("&a[%d][%d]=%p\n",i,j,& a[i][j]);
		}
		
	}
	return 0;
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

由此可见,无论是在同一行还是跨行,相邻元素之间都是相差四个字节,因此,二维数组在内存中也是连续存放的。 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值