引入
我们为什么会用到数组呢,设想一下,如果我们输入一组分数,然后计算平均数,最后输出在平均分以下的人的分数。当然,平均分数我们可以通过一个简单的循环算出,但在算出平均分数之后,我们又要去哪找到符合题意的分数并输出呢?这时我们的数组就可以大显身手了,用数组将所有分数储存,最后在输出符合条件的分数就大功告成啦!当然,这只是理论上的,那我们话不多说,现在就开始学习数组吧。
数组的概念
数组是一类相同元素的集合,也就是说在同一数组中的元素是同一种类型的,可能是整型,字符型或者其他类型(这就好比住在女生宿舍中的是同一类型--的都是女生嘛)。
于是,从这个概念中我们可以知道
(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};
| 数组 | 1 | 2 | 3 | 4 | 5 |
| 下标 | 0 | 1 | 2 | 3 | 4 |
因此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};
| 1 | 2 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
以上是初始化后数组中元素的值
(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};
以上两种初始化方式均正确,第一种是按照行来初始化的
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
需要注意的是
二维数组初始化是,行可以省略,但是列不可以省略。因为二维数组是连续存放的 ,如果一开始没有规定列的大小,我们甚至都不清楚第一行什么时候能够放满元素,就无法知道数组的大小。
二维数组的下标,无论是行还是列,下标都是从零开始的。
二维数组的输入和输出
上面我们已经知道了一维数组的输入和输出是由循环实现的,二维数组同样是如此,不过是使用的嵌套循环,首先是行,然后是列
#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;
}
由此可见,无论是在同一行还是跨行,相邻元素之间都是相差四个字节,因此,二维数组在内存中也是连续存放的。
1110

被折叠的 条评论
为什么被折叠?



