数组
1.认识数组
数组是⼀组相同类型元素的集合,数组又分为一维数组和多维数组。
换句话说,就是同一类型的东西放在一起。
2.一维数组
一维数组指的是只有一个下标的数组,它用来表示一组具有相同类型的数据。
2.1 一维数组的创建
基本格式如下:
type name[常量]
type 表示元素的类型,比如 int 、float 、char 等,也可以是自定义的类型。
name 是数组的名字。
常量相当于指定数组的大小,具体大小根据情况而定。
2.2 一维数组初始化
数组的初始化一般将元素放入大括号中。
int arr1[5]={5,6,7,8,9}; //完全初始化
int arr2[5]={3}; //第一个元素初始化为 3 ,其余元素为 0 (不完全初始化)
int arr[3]={6,7,8,9} ; //超出容量,只会取前三位(错误初始化)
2.3 下标
比如某数组有 n 位元素,该数组第一位元素下标为 0 ,最后一位的下标就是 n - 1,以此类推······(以 int arr[10]={1,2,3,4,5,6,7,8,9,10}; 为例)
要想根据下标找到元素也是可以实现的,这里,arr[4]=5 、arr[8]=9。
2.4 数组元素的打印
想要打印数组内的元素,可以根据下标进行操作。
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for (int i=0;i<10;i++) //利用for语句对下标进行循环,(0~9)
{
printf("%d ", arr[i]);
}
return 0;
}
输出结果:
1 2 3 4 5 6 7 8 9 10
2.5 数组元素的输入
元素的打印用的是下标,输入元素同样可以 根据下标来操作。
#include<stdio.h>
int main()
{
int arr[10];
for (int i=0;i<10;i++) //对下标进行循环,依次输入数据
{
scanf("%d", &arr[i]);
}
for (int j = 0; j < 10; j++) //数组元素的打印
{
printf("%d ", arr[j]);
}
return 0;
}
输出结果:
2 4 6 7 3 8 4 9 12 45 33 77 62 //输入的数据
2 4 6 7 3 8 4 9 12 45 //打印输出的数据
数组只会读取所需数据的个数,多余的数据会忽略。
3.二维数组
3.1 二维数组的创建
基本格式如下:
type name[常量1][常量2];
二维数组跟一维数组相比,只多了一个常量2。常量1和常量2分别表示数组的行和列。
3.2二维数组初始化
二维数组跟一维数组一样,都是在大括号内放入数据。
int arr1[4][2]={3,4,5}; //不完全初始化
int arr2[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //完全初始化
int arr3[3][5]={{1},{4,5},{7,8}}; //按行初始化
初始化时可以省略行,但不能省略列。
3.3 二维数组下标
可以将二维数组的下标理解为数学中的坐标。(行和列下标同样是从 0 开始)
int arr[3][4]={1,2,3,4, 5,6,7,8, 9,10,11,12};
比如,arr[2][2]=11、arr[1][3]=8 。
3.4二维数组的输入和输出
在一维数组中,只用了一个 for 循环,而在二维数组中一个 for 语句显然是不够的。
#include<stdio.h>
int main()
{
int arr[3][4]; //3行4列
for (int i = 0; i < 3; i++) //产生行
{
for (int j = 0; j < 4; j++) //产生列
{
scanf("%d",&arr[i][j]); //输入元素
}
}
for (int i = 0; i < 3; i++) //产生行
{
for (int j = 0; j < 4; j++) //产生列
{
printf("%d ", arr[i][j]); //输出元素
}
printf("\n");
}
return 0;
}
运行结果:
3 4 6 7 2 8 33 93 5 74 6 74 64 5 //输入元素个数大于所需数据个数
3 4 6 7
2 8 33 93
5 74 6 74 //共输出12个元素,其余省略
4.数组在内存中的存储
4.1 一维数组
下面就依次打印数组元素地址进行观察。
#include <stdio.h>
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 个字节。
4.2二维数组
二维数组我们继续打印元素地址
#include<stdio.h>
int main()
{
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("arr[%d][%d]=%p\n", i,j, &arr[i][j]);
}
}
return 0;
}
我们可以发现,arr[0][3] 和 arr[1][0] 这两个换行的位置相差也是 4 个字节 。
一维数组和⼆维数组中的每个元素都是连续存放。
5. 计算数组元素个数
如果想要知道数组元素个数,我们可以先计算数组所占内存空间的总⼤⼩(字节),再计算出⼀个元素所占字节的大小,两者相除就能够得出元素个数。
具体操作如下:
#include<stdio.h>
int main()
{
int arr[] = {1,2,4,6,7,8,54,87,99};
int r = sizeof(arr) / sizeof(arr[0]); //总大小/一个元素所占大小=个数
printf("%d", r);
return 0;
}
运行结果:
9
这样就可以根据所需灵活使用元素个数的值了。