1 · 数组的概念数组方便存放一组数据。数组是⼀组相同类型元素的集合从这个概念中我们就可以发现2个有价值的信息数组中存放的是1个或者多个数据但是数组元素个数不能为0。数组中存放的多个数据类型是相同的。数组分为⼀维数组和多维数组多维数组⼀般⽐较多⻅的是⼆维数组。2 · 一维数组的创建与初始化2 - 1 · 数组的创建⼀维数组创建的基本语法如下type arr_name[常量值];存放在数组的值被称为数组的元素数组在创建的时候可以指定数组的大小和数组的元素类型。type指定的是数组中存放数据的类型可以是char、short、int、float等也可以是自定义的类型。arr_name指的是数组名的名字这个名字根据实际情况起的有意义就行。[ ]中的常量值是⽤来指定数组的大小的这个数组的大小是根据实际的需求指定就行。⽐如我们现在想存储某个班级的20⼈的数学成绩那我们就可以创建⼀个数组如下int math[20];当然我们也可以根据需要创建其他类型和大小的数组。2 - 2 · 数组的初始化有时候数组在创建的时候我们需要给定⼀些初始值这种就称为初始化。那数组如何初始化呢数组的初始化⼀般使用大括号将数据放在大括号中。//完全初始化 int arr[5] {1,2,3,4,5}; //不完全初始化 int arr2[6] {1};//第⼀个元素初始化为1剩余的元素默认初始化为0 //错误的初始化 - 初始化项太多 int arr3[3] {1, 2, 3, 4};如果给数组初始化那么是可以不用写数组的大小的也就是 [ ]中可以不用写常量值这时数组的大小就是你初始化的元素个数。也就是说下面两个是一样的int arr[] {1,2,3,4,5,6,7,8,9,10}; int arr[10] {1,2,3,4,5,6,7,8,9,10};2 - 3 · 数组的类型数组也是有类型的数组算是⼀种自定义类型去掉数组名留下的就是数组的类型。如下int arr1[10]; int arr2[12]; char ch[5];arr1数组的类型是int [10]arr2数组的类型是int [12]ch 数组的类型是char [5]那我们有没有办法可以验证数组的类型呢可以用 sizeof。#include stdio.h int main() { int arr[5] { 0 }; printf(%zd\n, sizeof(arr)); printf(%zd\n, sizeof(int [5])); return 0; }运行结果3 · 一维数组的使用学习了⼀维数组的基本语法⼀维数组可以存放数据存放数据的目的是对数据的操作那我们如何使用⼀维数组呢3 - 1 · 数组下标C语⾔规定数组是有下标的下标是从0开始的假设数组有n个元素最后⼀个元素的下标是n-1下标就相当于数组元素的编号如下int arr[10] {1,2,3,4,5,6,7,8,9,10};数组12345678910下标0123456789在C语⾔中数组的访问提供了⼀个操作符[ ]这个操作符叫下标引⽤操作符。有了下标访问操作符我们就可以轻松的访问到数组的元素了⽐如我们访问下标为7的元素我们就可以使⽤ arr[7]想要访问下标是3的元素就可以使⽤arr[3],如下代码#include stdio.h int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; printf(%d\n, arr[3]); printf(%d\n, arr[7]); return 0; }结果如下 3 - 2 · 数组元素的打印接下来如果想要访问整个数组的内容那怎么办呢只要我们产生数组所有元素的下标就可以了那我们使⽤for循环产生0~9的下标接下来使用下标访问就⾏了。如下代码#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) { printf(%d , arr[i]); } return 0; }运行结果 3 - 3 · 数组的输入明⽩了数组的访问当然我们也根据需求⾃⼰给数组输⼊想要的数据如下#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; }我们随意输入10个数字结果如下 4 · 一维数组在内存中的存储有了前面的知识我们其实使用数组基本没有什么障碍了如果我们要深入了解数组我们最好能了解⼀下数组在内存中的存储。依次打印数组元素的地址#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) { printf(arr[%d]的地址为:%p\n, i, arr[i]); } return 0; }运行结果 %p 是以 16 进制形式打印 所以上面的 C 是 12 D是 13 F 是 15 。从输出的结果我们分析数组随着下标的增长地址是由小到大变化的并且我们发现每两个相邻的元素之间相差4因为⼀个整型是4个字节。所以我们得出结论数组在内存中是连续存放的。这就为后期我们使用指针访问数组奠定了基础。5 · 用 sizeof 计算数组元素个数在遍历数组的时候我们经常想知道数组的元素个数那C语⾔中有办法使⽤程序计算数组元素个数吗答案是有的可以使⽤sizeof。sizeof中C语言是⼀个关键字是可以计算类型或者变量大小的其实sizeof也可以计算数组的大小。我们在上面验证数组类型时已使用过。我们又知道数组中所有元素的类型都是相同的那只要计算出⼀个元素所占字节的个数数组的元素个数就能算出来。这里我们选择第⼀个元素算大小就可以。如下 #include stdio.h int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int sz sizeof(arr) / sizeof(arr[0]); printf(%d, sz); return 0; }这⾥的结果是10表示数组有10个元素。以后在代码中需要数组元素个数的地方就不⽤固定写死了使用上面的计算不管数组怎么变化计算出的大小也就随着变化了。6 · 二维数组的创建6 - 1 · 二维数组的概念前面介绍的数组被称为⼀维数组数组的元素都是内置类型的如果我们把一维数组做为数组的元素这时候就是二维数组二维数组作为数组元素的数组被称为三维数组⼆维数组以上的数组统称为多维数组。123452345634567这就是一个三行五列的二维数组二维数组的一行 我们认为是一维数组。6 - 2 · 二维数组的创建那我们如何定义⼆维数组呢语法如下type name[常量值1][常量值2]例如intarr[3][5];doubledata[2][8];3表示数组有3行5表示每⼀行有5个元素int 表示数组的每个元素是整型类型arr 是数组名可以根据自己的需要指定名字data数组意思基本⼀致。7 · 二维数组的初始化在创建变量或者数组的时候给定⼀些初始值被称为初始化。那⼆维数组如何初始化呢像⼀维数组⼀样也是使⽤大括号初始化的。7 - 1 · 不完全初始化intarr1[3][5] {1,2};intarr2[3][5] {0};arr1数组120000000000000arr2数组 0000000000000007 - 2 · 完全初始化intarr3[3][5] {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};arr3数组 1234523456345677 - 3 · 按照行初始化intarr4[3][5] {{1,2},{3,4},{5,6}};arr4 1200034000560007 - 4 · 初始化可以省略行但不能省略列intarr5[ ][5] {1,2,3};intarr6[ ][5] {1,2,3,4,5,6,7};intarr7[ ][5] {{1,2}, {3,4}, {5,6}};arr5 12300arr6 1234567000arr7 1200034000560008 · 二维数组的使用8 - 1 · 二维数组的下标当我们掌握了⼆维数组的创建和初始化那我们怎么使⽤⼆维数组呢其实⼆维数组访问也是使用下标的形式的⼆维数组是有行和列的只要锁定了行和列就能唯⼀锁定数组中的⼀个元素。C语⾔规定⼆维数组的行是从0开始的列也是从0开始的如下所示intarr[3][5] {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};图中绿色数字代表行号蓝色数字代表列号都是从0开始的比如我们说第2行第4列快速就能定位出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, }; printf(%d, arr[2][4]); return 0; }运行结果8 - 2 · 二维数组的输入和输出访问⼆维数组的单个元素我们知道了那如何访问整个⼆维数组呢其实我们只要能够按照⼀定的规律产⽣所有的行和列的数字就行以上⼀段代码中的arr数组为例行的选择范围是0~2列的取值范围是0~4所以我们可以借助循环实现生成所有的下标。如下 #include stdio.h 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)//记录列号 { scanf(%d, arr[i][j]);//输入数据 } } for (i 0; i 3; i)//记录行号 { for (j 0; j 5; j)//记录列号 { printf(%d , arr[i][j]);//输出数据 } printf(\n); } return 0; }我们随意输入15个值运行结果如下9 · 二维数组在内存中的存储像⼀维数组⼀样我们如果想研究⼆维数组在内存中的存储方式我们也是可以打印出数组所有元素的地址的。代码如下#include stdio.h 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; }运行结果 从输出的结果来看每⼀行内部的每个元素都是相邻的地址之间相差4个字节跨⾏位置处的两个元素如arr[0][4]和arr[1][0]之间也是差4个字节所以⼆维数组中的每个元素都是连续存放的。如下图 10 · C99中的变长数组在C99标准之前C语言在创建数组的时候数组大小的指定只能使⽤常量、常量表达式或者如果我们初始化数据的话可以省略数组大小。如 intarr1[10];intarr2[35];intarr3[] {1,2,3};这样的语法限制让我们创建数组就不够灵活有时候数组大了浪费空间有时候数组又小了不够用的。C99中给⼀个变⻓数组variable-length array简称 VLA的新特性允许我们可以使⽤变量指定数组大小。int n ab; int arr[n];上⾯示例中数组arr就是变⻓数组因为它的⻓度取决于变量n的值编译器没法事先确定只有运行时才能知道n是多少。变长数组的根本特征就是数组长度只有运行时才能确定所以变长数组不能初始化。它的好处是程序员不必在开发时随意为数组指定⼀个估计的长度程序可以在运行时为数组分配精确的长度。有⼀个比较迷惑的点变长数组的意思是数组的大小是可以使⽤变量来指定的在程序运⾏的时候根据变量的大小来指定数组的元素个数而不是说数组的大小是可变的。数组的大小⼀旦确定就不能再变化了。总结以上介绍了一维数组和二维数组及其相关内容关于C语言的其余内容请期待后续更新。以上内容如有错误或不准确之处欢迎指出或者你有更好的想法也欢迎交流。
数组 详解
1 · 数组的概念数组方便存放一组数据。数组是⼀组相同类型元素的集合从这个概念中我们就可以发现2个有价值的信息数组中存放的是1个或者多个数据但是数组元素个数不能为0。数组中存放的多个数据类型是相同的。数组分为⼀维数组和多维数组多维数组⼀般⽐较多⻅的是⼆维数组。2 · 一维数组的创建与初始化2 - 1 · 数组的创建⼀维数组创建的基本语法如下type arr_name[常量值];存放在数组的值被称为数组的元素数组在创建的时候可以指定数组的大小和数组的元素类型。type指定的是数组中存放数据的类型可以是char、short、int、float等也可以是自定义的类型。arr_name指的是数组名的名字这个名字根据实际情况起的有意义就行。[ ]中的常量值是⽤来指定数组的大小的这个数组的大小是根据实际的需求指定就行。⽐如我们现在想存储某个班级的20⼈的数学成绩那我们就可以创建⼀个数组如下int math[20];当然我们也可以根据需要创建其他类型和大小的数组。2 - 2 · 数组的初始化有时候数组在创建的时候我们需要给定⼀些初始值这种就称为初始化。那数组如何初始化呢数组的初始化⼀般使用大括号将数据放在大括号中。//完全初始化 int arr[5] {1,2,3,4,5}; //不完全初始化 int arr2[6] {1};//第⼀个元素初始化为1剩余的元素默认初始化为0 //错误的初始化 - 初始化项太多 int arr3[3] {1, 2, 3, 4};如果给数组初始化那么是可以不用写数组的大小的也就是 [ ]中可以不用写常量值这时数组的大小就是你初始化的元素个数。也就是说下面两个是一样的int arr[] {1,2,3,4,5,6,7,8,9,10}; int arr[10] {1,2,3,4,5,6,7,8,9,10};2 - 3 · 数组的类型数组也是有类型的数组算是⼀种自定义类型去掉数组名留下的就是数组的类型。如下int arr1[10]; int arr2[12]; char ch[5];arr1数组的类型是int [10]arr2数组的类型是int [12]ch 数组的类型是char [5]那我们有没有办法可以验证数组的类型呢可以用 sizeof。#include stdio.h int main() { int arr[5] { 0 }; printf(%zd\n, sizeof(arr)); printf(%zd\n, sizeof(int [5])); return 0; }运行结果3 · 一维数组的使用学习了⼀维数组的基本语法⼀维数组可以存放数据存放数据的目的是对数据的操作那我们如何使用⼀维数组呢3 - 1 · 数组下标C语⾔规定数组是有下标的下标是从0开始的假设数组有n个元素最后⼀个元素的下标是n-1下标就相当于数组元素的编号如下int arr[10] {1,2,3,4,5,6,7,8,9,10};数组12345678910下标0123456789在C语⾔中数组的访问提供了⼀个操作符[ ]这个操作符叫下标引⽤操作符。有了下标访问操作符我们就可以轻松的访问到数组的元素了⽐如我们访问下标为7的元素我们就可以使⽤ arr[7]想要访问下标是3的元素就可以使⽤arr[3],如下代码#include stdio.h int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; printf(%d\n, arr[3]); printf(%d\n, arr[7]); return 0; }结果如下 3 - 2 · 数组元素的打印接下来如果想要访问整个数组的内容那怎么办呢只要我们产生数组所有元素的下标就可以了那我们使⽤for循环产生0~9的下标接下来使用下标访问就⾏了。如下代码#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) { printf(%d , arr[i]); } return 0; }运行结果 3 - 3 · 数组的输入明⽩了数组的访问当然我们也根据需求⾃⼰给数组输⼊想要的数据如下#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; }我们随意输入10个数字结果如下 4 · 一维数组在内存中的存储有了前面的知识我们其实使用数组基本没有什么障碍了如果我们要深入了解数组我们最好能了解⼀下数组在内存中的存储。依次打印数组元素的地址#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) { printf(arr[%d]的地址为:%p\n, i, arr[i]); } return 0; }运行结果 %p 是以 16 进制形式打印 所以上面的 C 是 12 D是 13 F 是 15 。从输出的结果我们分析数组随着下标的增长地址是由小到大变化的并且我们发现每两个相邻的元素之间相差4因为⼀个整型是4个字节。所以我们得出结论数组在内存中是连续存放的。这就为后期我们使用指针访问数组奠定了基础。5 · 用 sizeof 计算数组元素个数在遍历数组的时候我们经常想知道数组的元素个数那C语⾔中有办法使⽤程序计算数组元素个数吗答案是有的可以使⽤sizeof。sizeof中C语言是⼀个关键字是可以计算类型或者变量大小的其实sizeof也可以计算数组的大小。我们在上面验证数组类型时已使用过。我们又知道数组中所有元素的类型都是相同的那只要计算出⼀个元素所占字节的个数数组的元素个数就能算出来。这里我们选择第⼀个元素算大小就可以。如下 #include stdio.h int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int sz sizeof(arr) / sizeof(arr[0]); printf(%d, sz); return 0; }这⾥的结果是10表示数组有10个元素。以后在代码中需要数组元素个数的地方就不⽤固定写死了使用上面的计算不管数组怎么变化计算出的大小也就随着变化了。6 · 二维数组的创建6 - 1 · 二维数组的概念前面介绍的数组被称为⼀维数组数组的元素都是内置类型的如果我们把一维数组做为数组的元素这时候就是二维数组二维数组作为数组元素的数组被称为三维数组⼆维数组以上的数组统称为多维数组。123452345634567这就是一个三行五列的二维数组二维数组的一行 我们认为是一维数组。6 - 2 · 二维数组的创建那我们如何定义⼆维数组呢语法如下type name[常量值1][常量值2]例如intarr[3][5];doubledata[2][8];3表示数组有3行5表示每⼀行有5个元素int 表示数组的每个元素是整型类型arr 是数组名可以根据自己的需要指定名字data数组意思基本⼀致。7 · 二维数组的初始化在创建变量或者数组的时候给定⼀些初始值被称为初始化。那⼆维数组如何初始化呢像⼀维数组⼀样也是使⽤大括号初始化的。7 - 1 · 不完全初始化intarr1[3][5] {1,2};intarr2[3][5] {0};arr1数组120000000000000arr2数组 0000000000000007 - 2 · 完全初始化intarr3[3][5] {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};arr3数组 1234523456345677 - 3 · 按照行初始化intarr4[3][5] {{1,2},{3,4},{5,6}};arr4 1200034000560007 - 4 · 初始化可以省略行但不能省略列intarr5[ ][5] {1,2,3};intarr6[ ][5] {1,2,3,4,5,6,7};intarr7[ ][5] {{1,2}, {3,4}, {5,6}};arr5 12300arr6 1234567000arr7 1200034000560008 · 二维数组的使用8 - 1 · 二维数组的下标当我们掌握了⼆维数组的创建和初始化那我们怎么使⽤⼆维数组呢其实⼆维数组访问也是使用下标的形式的⼆维数组是有行和列的只要锁定了行和列就能唯⼀锁定数组中的⼀个元素。C语⾔规定⼆维数组的行是从0开始的列也是从0开始的如下所示intarr[3][5] {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};图中绿色数字代表行号蓝色数字代表列号都是从0开始的比如我们说第2行第4列快速就能定位出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, }; printf(%d, arr[2][4]); return 0; }运行结果8 - 2 · 二维数组的输入和输出访问⼆维数组的单个元素我们知道了那如何访问整个⼆维数组呢其实我们只要能够按照⼀定的规律产⽣所有的行和列的数字就行以上⼀段代码中的arr数组为例行的选择范围是0~2列的取值范围是0~4所以我们可以借助循环实现生成所有的下标。如下 #include stdio.h 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)//记录列号 { scanf(%d, arr[i][j]);//输入数据 } } for (i 0; i 3; i)//记录行号 { for (j 0; j 5; j)//记录列号 { printf(%d , arr[i][j]);//输出数据 } printf(\n); } return 0; }我们随意输入15个值运行结果如下9 · 二维数组在内存中的存储像⼀维数组⼀样我们如果想研究⼆维数组在内存中的存储方式我们也是可以打印出数组所有元素的地址的。代码如下#include stdio.h 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; }运行结果 从输出的结果来看每⼀行内部的每个元素都是相邻的地址之间相差4个字节跨⾏位置处的两个元素如arr[0][4]和arr[1][0]之间也是差4个字节所以⼆维数组中的每个元素都是连续存放的。如下图 10 · C99中的变长数组在C99标准之前C语言在创建数组的时候数组大小的指定只能使⽤常量、常量表达式或者如果我们初始化数据的话可以省略数组大小。如 intarr1[10];intarr2[35];intarr3[] {1,2,3};这样的语法限制让我们创建数组就不够灵活有时候数组大了浪费空间有时候数组又小了不够用的。C99中给⼀个变⻓数组variable-length array简称 VLA的新特性允许我们可以使⽤变量指定数组大小。int n ab; int arr[n];上⾯示例中数组arr就是变⻓数组因为它的⻓度取决于变量n的值编译器没法事先确定只有运行时才能知道n是多少。变长数组的根本特征就是数组长度只有运行时才能确定所以变长数组不能初始化。它的好处是程序员不必在开发时随意为数组指定⼀个估计的长度程序可以在运行时为数组分配精确的长度。有⼀个比较迷惑的点变长数组的意思是数组的大小是可以使⽤变量来指定的在程序运⾏的时候根据变量的大小来指定数组的元素个数而不是说数组的大小是可变的。数组的大小⼀旦确定就不能再变化了。总结以上介绍了一维数组和二维数组及其相关内容关于C语言的其余内容请期待后续更新。以上内容如有错误或不准确之处欢迎指出或者你有更好的想法也欢迎交流。