目录
1. 数组的概念
数组是⼀组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息:
1. 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
2. 数组中存放的多个数据,类型是相同的
3. 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组
4. 数组可以没有初始值和大小
2. ⼀维数组的创建和初始化
2.1 数组创建
⼀维数组语法形式:type arr_name[常量值]; int arr[20] = {0};
存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型
type 指定的是数组中存放数据的类型,如: char、short、int、float 等,也可以自定义类型 |
arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义就行 |
[] 中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行 |
int math[20];
char ch[8];
double score[10];
2.2 数组的初始化
将数据放在大括号中就是数组的初始化
//完全初始化
int arr[5] = { 1,2,3,4,5 };
//不完全初始化
//第⼀个元素初始化为1,剩余的元素默认初始化为0
int arr2[6] = { 1 };
//错误的初始化 - 初始化项太多
int arr3[3] = { 1, 2, 3, 4 };
2.3 数组的类型
数组也是有类型的,数组算是⼀种自定义类型,去掉数组名留下的就是数组的类型
int arr1[10];
int arr2[12];
char ch[5];
arr1数组的类型是 int [10] arr2数组的类型是 int[12] ch 数组的类型是 char [5]
3. ⼀维数组的使用
我们知道,⼀维数组可以存放数据,存放数据的目的是对数据的操作,那么我们应该如何使用呢?
3.1 数组下标的访问
C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
在C语⾔中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引⽤操作符
有了下标访问操作符,我们就可以轻松的访问到数组的元素了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//访问下标为2的元素
printf("%d\n", arr[2]);
//访问下标为3的元素
printf("%d\n", arr[3]);
return 0;
}
访问整个数组的内容
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 ", arr[i]);
}
return 0;
}
4. ⼀维数组在内存中的存储
依次打印数组元素的地址
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个字节),所以我们得出结论:数组在内存中是连续存放的
5. ⼆维数组的概念
我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组
5.1 ⼆维数组的创建
二维数组语法形式:
type arr_name[常量值1][常量值2]; 例如: int arr[3][5]; double data[2][8]; 3表⽰数组有3⾏ 5表⽰每⼀⾏有5个元素 int 表⽰数组的每个元素是整型类型 arr 是数组名,可以根据⾃⼰的需要指定名字 data数组意思基本⼀致。
5.2 ⼆维数组的初始化
⼆维数组的初始化和⼀维数组⼀样,也是使⽤⼤括号初始化的
不完全初始化
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};
2345为第一行,23456为第二行,34567为第三行
初始化时可以省略行,但是不能省略列
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} };
6. ⼆维数组的使用
6.1 ⼆维数组的下标
⼆维数组的访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素
C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
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]);
printf("%d\n", arr[2][2]);
printf("%d\n", arr[1][4]);
return 0;
}
打印整个二维数组
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;
}
6.2 二维数组的存储
像一维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址
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;
}
和一维数组一样,⼆维数组中的每个元素也是连续存放的
7. C99中的变长数组
在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小
比如:
int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};
这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够用的
C99中给⼀个变⻓数组(VLA)的新特性,允许我们可以使⽤变量指定数组大小,如:
int n = a+b; int arr[n];
数组 arr 就是变长数组,它的长度取决于变量 n 的值,编译器无法事先确定,只有运行时才能知道n是多少
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化
完结撒花~