今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始.
数组的概念
数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组.
下面从一维数组说起.
一维数组的创建和初始化
数组创建
⼀维数组创建的基本语法如下:(数组在创建的时候可以指定数组的大小和数组的元素类型).
type arr_name[常量值];
1.type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型
2.arr_name 指的是数组名的名字
3.[] 中的常量值是⽤来指定数组的大小的
数组的初始化
数组在创建的时候,我们需要给定⼀些初始值值,这种就称为初始化.数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中.
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
//完全初始化
int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };
//不完全初始化:其余的会被默认初始化为0
int arr2[10] = { 1,2 };
//[]中不写,初始化为几个就是几个元素
int arr3[] = { 1,2,3,4,5 };
Print(arr1, 10);
Print(arr2, 10);
Print(arr3, sizeof(arr3)/sizeof(arr3[0]));
return 0;
}
数组的类型
数组也是有类型的,数组算是⼀种⾃定义类型,去掉数组名留下的就是数组的类型.
int arr[10]的类型就是int [10];
char ch[5]的类型是 char [5];
一维数组的使用
简单的了解了一维数组后,让我们复习一下它的使用.
数组下标
定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1.如下图:
我们通常用下标引用符[ ]来访问数组元素.例如我们访问下标为7的元素,我们就可以使用arr[7].
数组元素的打印和输入
在上面初始化中为了看见初始化的结果,我已经将打印的代码先使用了.因为数组用下标访问,所以只要便利数组下标就可以打印数组了.
数组的输入与打印类似,大概如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
Print(arr, 10);
return 0;
}
一维数组在内存中的存储
想要了解一维数组在内存中的存储最好的方法就是打印数组中每个元素的地址.代码和结果如下图.
由上图输出结果可知,每两个元素之间都隔离四个字节,而一int类型就占四个类型.所以我们得出结论:数组在内存中是连续存放的.
sizeof计算数组元素个数
在遍历数组的时候,我们经常想知道数组的元素个数.在C语言中我们可以用sizeof来实现.
sizeof中C语⾔是⼀个关键字,是可以计算类型或者变量大小的,(他的返回值是所计算类型或变量所占的字节数),其实 sizeof 也可以计算数组的大小.如下
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));
return 0;
}
因为数组中所有元素的类型都是相同的,那只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来。这⾥我们选择第⼀个元素算大小就可以.然后二者相除就可以得出数组元素个数.
int main()
{
int arr[10] = { 0 };
int a = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", a);
return 0;
}
有了这个方法,以后在代码中需要数组元素个数的地⽅就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了.
二维数组
二维数组得概念
前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素,这时候就是二维数组,⼆维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组.
二维数组的创建和初始化
二维数组的创建:
type arr_name[常量值1][常量值2];
常量值1表示二维数组有几行
常量值2表示二维数组有几列
type是元素类型
arr_name是数组名
那⼆维数组如何初始化呢?像⼀维数组⼀样,也是使⽤⼤括号初始化的.
不完全初始化
int main()
{
//不完全初始化
int arr1[3][5] = { 1,2,3,4,5 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", arr1[i][j]);
}
printf("\n");
}
printf("\n");
//按照⾏初始化
int arr2[3][5] = { {1,2},{3},{4,5} };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
return 0;
}
输出结果
完全初始化
int main()
{
//完全初始化
int arr1[2][5] = { 1,2,3,4,5,6,7,8,9,0};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", arr1[i][j]);
}
printf("\n");
}
return 0;
}
输出结果
类似于一维数组,初始化时省略行,但是不能省略列
int main()
{
int arr1[][5] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", arr1[i][j]);
}
printf("\n");
}
return 0;
}
输出结果
二维数组的使用
⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定 数组中的⼀个元素.
如上图,最右侧绿⾊的数字表示行号,第⼀⾏蓝⾊的数字表⽰列号,都是从0开始的,
例如,我们说:第2行,第4列,快速就能定位出7.
二维数组的输入和输出
同样在上面为了观察初始化的结果,我已经使用了二维数组的输出,输入与输出类似.代码见下
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;
}
二维数组在内存中的存储
像⼀维数组⼀样,如果想研究⼆维数组在内存中的存储⽅式,我们也是可以打印出数组所有元素的地址.结果如下
从输出的结果来看,每⼀⾏内部的每个元素地址之间都相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的.如下图所示
还有一点点为c99中的变长数组,了解即可~以上就是所有复习内容啦,下篇复习见~