C语言中的数组
数组
概念
- 数组是一组相同类型元素的集合;
- 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
- 数组中存放的多个数据,类型是相同的。
- 数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。
一维数组
数组的创建
type arr_name[常量值]
- 数组在创建的时候可以指定数组的大小和数组的元素类型。
type
指定的是数组中存放数据的类型,可以是:char、short、int、float
等,也可以自定义的类型。arr_name
指的是数组名的名字。[]
中的常量值是用来指定数组的大小的。-
//存储某个班级的20个人的数学成绩 int math[20]
-
数组的初始化
数组的初始化一般使用大括号,将数据放在大括号中。
//完全初始化
int arr[5] = {1, 2, 3, 4, 5};
//不完全初始化
int arr[5] = {1};//第一个元素初始化为1,剩余的元素默认初始化为0
数组的类型
- 去掉数组名留下的就是数组的类型
int arr[10] //类型:int [10]
int arr[5] //类型:int [5]
一维数组的使用
数组下标
- 假设数组有 n 个元素,第一个元素的下标是 0 ,最后一个元素的下标是 n-1。
- 在C语言中数组的访问提供了一个操作符
[]
,这个操作符叫:下标引用操作符。 - 我们访问下标为7的元素,我们就可以使用
arr[7]
,想要访问下标是3的元素,就可以使用arr[3]
,如下代码:-
#include <stdio.h> 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; }
-
数组元素的打印
#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("%d\n", arr[i]);
}
return 0;
}
数组的输入
#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++)
{
scanf("%d", &arr[i]);
}
for(i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
一维数组在内存中的存储
#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;
}
//输出结果
//&arr[0] = 0133F8D0
//&arr[1] = 0133F8D4
//&arr[2] = 0133F8D8
//&arr[3] = 0133F8DC
//&arr[4] = 0133F8E0
//&arr[5] = 0133F8E4
//&arr[6] = 0133F8E8
//&arr[7] = 0133F8EC
//&arr[8] = 0133F8F0
//&arr[9] = 0133F8F4
%p
打印地址- 数组随着下标的增长,地址是由小到大变化的,并且每两个相邻的元素之间相差4(因为一个整型是4个字节)。
- 数组在内存中是连续存放的。
sizeof 计算数组元素个数
sizeof
后面如果是变量数组,则可省略括号,是类型则不可
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof arr);
return 0;
}
// 输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。
- 数组中所有元素的类型都是相同的
#include <stdio.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof arr[0]); //计算一个元素的大小,单位是字节
return 0;
}
- 计算数组的元素个数
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]); //计算的是数组的元素个数
printf("%d\n", sz);
return 0;
}
//结果是10,表示数组有10个元素
二维数组
概念
- 数组的元素都是内置类型的,如果我们把一维数组做为数组的元素,这时候就是二维数组,
- 二维数组作为数组元素的数组被称为三维数组,
- 二维数组以上的数组统称为多维数组。
创建
type arr_name[常量值1][常量值2];
int arr[3][5]
- 3表示数组有3行
- 5表示每一行有5个元素
int
表示数组的每个元素是整型类型arr
是数组名,可以根据自己的需要指定名字
初始化
不完全初始化
int arr1[3][5] = {1, 2};
int arr2[3][5] = {0};
完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
初始化可省略行,但是不能省略列
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}};
二维数组的使用
二维数组的下标
C语言规定,二维数组的行是从0开始的,列也是从0开始的:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
printf("%d\n", arr[2][4]);
return 0;
}//输出7
二维数组的输入和输出
#include <stdio.h>
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;
}
二维数组在内存中的存储
#include <stdio.h>
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;
}
//&arr[0][0] = 00CFF860
//&arr[0][1] = 00CFF864
//&arr[0][2] = 00CFF868
//&arr[0][3] = 00CFF86C
//&arr[0][4] = 00CFF870
//&arr[1][0] = 00CFF874
//&arr[1][0] = 00CFF878
//&arr[1][1] = 00CFF87C
//&arr[1][2] = 00CFF880
//&arr[1][3] = 00CFF884
//&arr[1][4] = 00CFF888
//&arr[2][1] = 00CFF88C
//&arr[2][2] = 00CFF890
//&arr[2][3] = 00CFF894
//&arr[2][4] = 00CFF898
- 每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:
arr[0][4]
和arr[1][4]
)之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。
C99中的变长数组
- 允许我们可以使用变量指定数组大小。
int n = a + b;
int arr[n];
- 数组
arr
是变长数组,长度取决于变量的值,只有运行时才能知道n
是多少。 - 变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。
- 变长数组的意思是数组的大小是可以使用变量来指定的。
- 数组的大小一旦确定就不能再变化了。