数组(Array)是C语言中一种自定义类型,用于存储一组相同类型元素的集合。
一、数组的概念
数组是一组相同类型元素的集合,如int a[2]={1,2},就是一个整型数组,大括号{ }内的这组元素均为整型。
特点:
- 数组中元素个数不能为0,即至少存放一个数据
- 数组中存放的数据类型均相同
二、一维数组
创建语法:数据类型 数组名[数组大小],如 int a[5],即创建了一个整型数组a,其内有5个整型数据元素。
type arr_name[常量值]; // 如 int a[5];
初始化:即在创建一维数组的同时给定一些初始值,放入大括号{ }中。
int a[5] = {1, 2, 3, 4, 5}; // 完全初始化,数组所有元素都给定了初始值
int b[6] = {1}; // 不完全初始化,数组第⼀个元素初始化为1,剩余的元素默认初始化为0
int c[3] = {1, 2, 3, 4}; // 初始化错误, 超出了定义的数组大小 3
int arr[] = {23, 12, 45, 67}; // 省略数组大小,由初始化值确定数组大小为 4
- 当数组已经初始化了,则可省略数组的大小,其大小由编译器根据初始化内容确定。如 int arr[ ]={23,12,45,67},这里省略了数组的大小,但可根据初始化内容确定其数组大小为 4
- C99 标准之前数组的大小只能使用常量,不能使用变量
数据类型:数组是一种自定义类型,去掉数组名留下的即为数组类型。
int a[5];
int b[10];
char c[10]; // 数组a的类型为 int [5],数组b的类型为 int [10],数组c的类型为 char [10]
注:数组前面的数据类型,声明的是数组内数据元素的类型,如 int a[5],其数组里的元素均为整型,而数组的类型为 int [5]。
一维数组的访问:C语言规定数组有下标,且下标从0开始,通过下标引用操作符 [ ] 即可访问数组内的元素。如,创建一个数组 int arr[] = {23, 12, 45, 67},则arr[0] = 23,访问下标为0的元素;arr[1] = 12,访问下标为1的元素;arr[2] = 45,访问下标为2的元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
// 输入十个整数,并输出打印至屏幕
int arr[10] = {0}; // 创建arr数组,大小为 10 ,并都初始化 0
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]); // 循环输入10个整数
}
system("pause"); // 暂停程序
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]); // 按下标从0到9输出数组元素
}
printf("\n");
return 0;
}
数组在内存中的存储:数组在内存中是连续存放的,且地址随下标的增大而由小到大变化。
#define _CRT_SECURE_NO_WARNINGS 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++)
{
// %p,地址占位符
printf("&arr[%d] = %p\n ", i, &arr[i]); // 打印数组各元素的地址
}
return 0;
}
sizeof():C语言的关键字之一,用于计算类型或者变量大小,也可计算数组大小,返回值为所占内存空间的总大小,单位为字节(Byte)。
#include <stdio.h>
int main()
{
// sizeof(),计算类型或变量所占内存的大小,单位为字节
printf("%d\n", sizeof(char)); // 输出打印 1
printf("%d\n", sizeof(short)); // 输出打印 2
printf("%d\n", sizeof(int)); // 输出打印 4
printf("%d\n", sizeof(long)); // 输出打印 4 C语言规定:sizeof(long)>=sizeof(int)
printf("%d\n", sizeof(long long)); // 输出打印 8
printf("%d\n", sizeof(float)); // 输出打印 4
printf("%d\n", sizeof(double)); // 输出打印 8
int arr[10]={0}; // 创建数组并初始化
printf("%d\n", sizeof(arr[0])); // 计算数组第一个元素所占内存大小,输出打印 4
printf("%d\n", sizeof(arr)); // 计算整个数组所占内存大小,输出打印 40
// 计算数组元素个数,输出打印 10
printf("%d\n", sizeof(arr)/sizeof(arr[0]));
return 0;
}
三、二维数组
概念:把⼀维数组作为数组的元素,即为二维数组,同理,将二维数组作为数组的元素,即为三维数组。
创建语法:数据类型 数组名[行][列],如 int a[3][5],即创建了一个整型二维数组a,其内有3个一维数组(行),每个一维数组(行)有5个整型数据元素(列)。
type arr_name[常量值1][常量值2]; // 如 int a[3][5];
初始化:即在创建二维数组的同时给定一些初始值,放入大括号{ }中
- 不完全初始化:程序会从第一行第一列开始初始化,未初始化到的值默认为 0
// 初始化第一行第1,2列位置的元素分别为1,2,其余行、列元素默认为 0
int a1[3][5] = {1,2};
// 初始化第一行所有数据和第二行第1,2,3列位置的元素分别为6,7,8,其余行、列元素默认为 0
int a2[3][5] = {1,2,3,4,5,6,7,8};
// 初始化第一行前两位数据,第二行前三位数据,第三行前三位数据,其余行、列元素默认为 0
int a3[3][5] = {{1,2},{3,4,5},{6,7,8};
- 完全初始化:
int b1[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int b2[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
- 初始化时,行可省略,列不能省略,其行数由编译器根据初始化内容确定
int c1[][5] = {1,2,3}; // 一行
int c2[][5] = {1,2,3,4,5,6,7}; // 两行
int c3[][5] = {{1,2}, {3,4}, {5,6}}; // 三行
二维数组的访问:C语言规定二维数组的行和列下标均是从0开始,通过下标引用操作符 [ ] 即可访问二维数组内的元素。如,创建一个二维数组 int arr[2][3] = {{23, 12, 45}, {67}},则arr[0][0] = 23,访问第一行第一列的元素,即行、列下标均为 0 的元素;arr[1][2] = 0,访问第二行第三列的元素,即行下标为 1,列下标为 3 的元素,此时的元素值初始化默认为0。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
// 二维数组的输入与输出
int arr[3][5] = {{1,1}, {2,2,2}, {3,3,3,3}};
printf("%d\n", arr[1][3]); // 访问第二行第四个元素,输出结果: 0
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[2][3] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
// %p,地址占位符
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
四、C99标准中的变长数组
在C99标准之前,C语言创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者在初始化数据的时候,可以省略数组大小。
int a1[10];
int a2[3+5];
int a3[] = {1,2,3};
这种创建数组的方式,不够灵活,有时候就会出现数组大了浪费空间,数组小了又不够用。于是,在C99标准中,就引入了变长数组的概念,允许数组的大小可以是变量。
注:
- VS虽然支持了C99语法,但不是全部支持,比如,变长数组在VS上是不支持的
- 变长数组不能初始化
在gcc编译器上的测试:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n); // 根据输⼊数值确定数组的⼤⼩
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
五、代码练习
一、输入三个整数,按从小到大输出。
二、在屏幕上输出 9*9 乘法口诀表。
三、打印100~200之间的素数。
四、求10个整数中最大值。
五、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,并打印结果。
六、编写程序数一下1~100的所有整数中出现多少个数字9。
七、编写一个程序,从用户输入中读取10个整数并存储在一个数组中。然后,计算并输出这些整数的平均值。
参考代码:https://gitee.com/zuiltd/c-language/commit/0c3b04a35cac520dcf1e7afe6a4ad1755fb5ae7a