椋鸟C语言笔记#11:数组

萌新的学习笔记,写错了恳请斧正。


 

目录

 

什么是数组

一维数组

一维数组的创建与初始化

创建

初始化

数组的类型

数组的取用

数组下标

下标引用操作符

数组的输入与输出

输入

输出

一维数组在内存中的存储

获取数组元素的个数

二维数组

二维数组的创建

初始化

不完全初始化

完全初始化

按行初始化(完全)

按行初始化(不完全)

初始化只能省略行不能省略列

二维数组的取用

二维数组的输入输出

二维数组在内存中的存储

变长数组(VLA)


什么是数组

数组是一组相同类型元素的集合

数组分为一维数组和多维数组,多维数组一般只用二维

一维数组

一维数组的创建与初始化

创建

一维数组的创建方法如下:

type arr_name[常量];

type规定数组元素的类型,如char、int、short等等

arr_name就是我们自己起的数组名

方括号中的常量用来规定数组的大小,即元素容量

比方说可以这样创建数组:

int a[4];
short b[5];
char c[6];
初始化

在数组创建时,我们可以直接给予一些初始值:

//完全初始化
int arr[4] = {1, 2, 3, 4};
//不完全初始化
int abc[3] = {6};
//错误的初始化,溢出
int aaa[2] = {1, 2, 3}
//不给常量的初始化
int hhh[] = {1, 1, 4}

不完全初始化时,数组从前往后获取元素,未被初始化的元素默认为0

初始化如果不给常量,就会根据所给的元素数量自动确定数组大小

一旦数组大小被确定就无法更改!!!

数组的类型

数组本身是有类型的,是一种自定义类型

我们创建数组的语句把其中的数组名去掉就是数组的类型

比如说:

char ch[10];  //此数组类型为 char [10]
int num[5];   //此数组类型为 int [5]
long lnum[7]; //此数组类型为 long [7]

数组的取用

数组下标

数组中每一个元素都有一个“门牌号”,称为数组下标

数组下标从0开始,即数组第一个元素的编号为0,随后为1、2、3……

所以大小为n的数组最大编号为n-1

下标引用操作符

C语言提供了一个操作符用于提取数组中的元素,即一对英文方括号

下标引用操作符用于提取数组中的元素,用法如下:

a = arr[3];

此处便是将arr数组中数组下标为3的元素(第四个)赋值给了a

数组的输入与输出

一般我们会通过for循环来执行数组的输入输出

输入
for (int i = 0; i < n; i++)  //n为数组长度
    scanf("%d", arr[i]);
输出
for (int i = 0; i < n; i++)
    printf("%d", arr[i]);

一维数组在内存中的存储

一维数组在内存中线性递增的存储

也就是说,数组的每一个元素在内存中紧挨着依次增加

比方说一个int数组,第一个元素地址为10000000,第二个为10000004,随后是10000008、1000000C、10000010……我们发现,每两个元素间相差4字节,这正好是int类型的长度。

获取数组元素的个数

我们可以使用之前提到的sizeof来获取数组的大小,而我们又知道数组每个元素的大小,那么相除就得到了数组元素的个数。如下为int数组元素个数:

sizeof(arr) / sizeof(arr[0])
sizeof(arr) / sizeof(int)

上面两种皆可,第一种比较泛用。

二维数组

二维数组可以理解为以一维数组为元素的数组

更高维度的以此类推

二维数组的创建

type arr_name[常量1][常量2];

与一维数组类似,常量1代表行数,常量2为列数

也可以理解为[常量1]个类型为arrname[常量2]的一维数组集合成的数组

初始化

不完全初始化

从前往后填充,先填完第一个一维数组再填第二个,后面补0

int arr[3][5] = {1,2};
完全初始化
 int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
按行初始化(完全)
int arr[2][3] = {{1,2,3},{4,5,6}};
按行初始化(不完全)

每个一维数组剩下的补0

int arr[2][3] = {{1,2},{4,5,6}};
初始化只能省略行不能省略列
int arr[][5] = {{1,2,3,4,5}, {3,4}, {5,6,7}};

二维数组的取用

与一维数组类似,行列都从0开始

a = arr[1][2];

上方即为把arr数组的第二行第三列赋值给a

二维数组的输入输出

与一维类似,多嵌套一个for循环即可,内外循环分别遍历行号与列号,不赘述

二维数组在内存中的存储

与一维数组一致,二维数组元素也连续存放

二维数组中的每个一维数组间没有空隙

变长数组(VLA)

C99标准中引入了变长数组的概念

即可以使用变量来创建数组

这样,数组的大小在编译时不会被确定,而是在运行时确定

注意:变长数组不是说数组长度可变。被确定大小后,无论那个变量再变成啥,数组的长度也不会改变了。

另外:Visual Stodio采用msvc编译器,不支持变长数组(但可以利用malloc来达到相同的目的)

gcc编译器支持变长数组


你可能感兴趣的:(C语言笔记,c语言,笔记,算法)