数组
数组指的是一组相同类型元素的集合,至少得存放一个数据,意味着数组元素个数不能为0;数组可以分为一维数组及多维数组(二维及以上的数组)。
- 一维数组
- 数组的创建
//数组创建的语法形式
type arr_name[常量值];
数组在创建的同时可以指定数组的大小和数组的元素类型
。数组的类型可以是:char, short, int ,float等,也可以是自定义类型
。arr_name 是数组名,在实际命名时最好见名知意
。[ ] 中的常量值是指定数组大小的,值得注意的是[ ]中的常量值只能是常量及常量表达式
- 数组的初始化
数组的初始化可分为静态初始化和动态初始化,其中静态初始化又可分为完全初始化和不完全初始化。
//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr1[5] = {1}; //所谓的不完全初始化是只初始化其中的部分,剩下的则由编译器默认初始化
//动态初始化
int arr2[] = {1,2,3,4,5,6,7}; //动态初始化就是不指定数组的元素个数,而是直接由写入的元素将数组撑起来
- 数组的类型
。 数组算是一种自定义类型,将数组名去掉留下的部分就是数组的类型
int arr1[10];
char arr2[5];
arr1数组的类型就是 int [10]
arr2数组的类型就是 char [5]
- 数组使用
。数组下标: C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号(数组下标和数组中元素位序不是一回事)
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
arr数组和下标
C 语言中使用下标引用操作符来访问数组中的元素
#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] = {0};
//输入
int i = 0;
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
//输出
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输入输出结果如下:
- 一维数组咋内存中的存放
数组的内存地址输出打印如下:
可以看出数组在内存中是按顺序连续存放的,每个元素之间相差4个字节,这是由元素类型决定的
- 数组元素个数
。数组元素个数使用sizeof 关键字计算,sizeof关键字是计算类型或变量在内存中所占大小
。值得注意的是sizeof后面只跟数组名,则计算的是整个数组的大小
- 二维数组
二维数组从本质上来说,就是一维数组,只不过它的元素类型是一个一维数组;这也意味着二维数组与一维数组有这相似的操作
//二维数组的语法形式
type arr_name [常量值1][常量值2];
其中常量值1 表示行,常量值2 表示列;二维数组也就是一个由行列构成的矩阵。
- 二维数组的创建及初始化
//创建的同时初始化
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
//不完全初始化
int arr[3][5] = {{1,2},{2,3},{3,4}};
ps:二维数组在初始化时可以省略行但不可以省略列;也是靠这数组中的元素将其撑起来的
- 二维数组的使用
。⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素。
。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};
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;
}
- 二维数组在内存中的存储
二维数组和一维数组一样在内存中也是按顺序连续存放的,每个元素之间相差等量大小的字节
二维数组的每个元素都是一个数组,其在内存中的分配如上图所示
- 变长数组
变长数组是C99中给出的数组新特性,它可以允许我们使用变量指定数组的大小,比如:
int n = a + b;
int arr[n];
在使用变长数组时需要注意以下几点:
①数组的长度只有在运行时才能确定,所以变长数组不能被初始化
②变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的,在程序运⾏的时候,根据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的⼤⼩是可变的。数组的⼤⼩⼀旦确定就不能再变化了。
③VS编译器虽然支持大部分C99语法,但不支持变长数组,所以在VS上不能实现变长数组的操作