🌈个人主页:godspeed_lucip
🔥 系列专栏:《C++程序设计》阅读笔记
本文对应的PDF源文件请关注微信公众号程序员刘同学
,回复C++程序设计
获取下载链接。
- 1 数组
- 1.1 概述
- 1.2 数组初始化
- 1.2.1 概述
- 1.2.2 字符数组的初始化
- 1.2.3 省略数组大小
- 1.3 向函数传递数组
- 1.4 二维数组
- 1.4.1 初始化
- 1.4.2 省略第一维大小
- 1.4.3 二维数组的降维
- 2 总结
1 数组
1.1 概述
char buf[5]; //5表示元素的个数
这个字符数组可以是最长为4个字符的单词,因为第5个字节用于'\0'
字符,用'\0'
字符结束的字符数组构成一个字符串。
数组定义的方括号中,常量表达式可以包含枚举常量和字符常量,该常量表达式的值是在编译时确定的。因为要为数组分配长度固定的空间。假如不是常量,则每次编译时分配给数组的空间都不一样,这是不行的
熟悉下面的例子:
注意:即使size是全局变量,也是不行的。但假如size是常量,例如:const int size=1,那么int array[size]是可以的
全局作用域下的数组、和静态局部作用域下的数组,其初始值为全0。而局部作用域下的数组存储在栈区,其值是不确定的
数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。
char (*fp)[3];
实际上是声明了一个指向一维数组的指针。且这个一维指针包含3个char元素。那么fp本质上就是一个二维指针了
1.2 数组初始化
1.2.1 概述
注意下面几个典型错误:
好像
int array4[5]={}
并没有错,只会将数组各元素初始化为0
看下面的示例:
则结果为:
解释:全局数组和静态局部数组的默认值为0。int array1[5]={1,2,3}
会将该数组的前三个值进行初始化,剩下的则会被默认初始化为0。array2
和arr2
同理。而arr1
是局部数组,且只初始化了一个值,但由于代码int arr1[5]={2}
已经开启了arr1的初始化,因此其剩下没有显式指明的元素会被初始化为0。
1.2.2 字符数组的初始化
下面的三种方式都是可以的
char array[10]={"hello"};
char array[10]="hello";
char array[10]={'h','e','l','l','o','\0'};
记得要为
\0
单独分配一个空间
1.2.3 省略数组大小
只要数组一开始就被初始化了,那么其大小是可以省略不写的
例如:
int ar[5]={1,2,3,4,5};
int ar[]={1,2,3,4,5}; //是等价的
可以使用sizeof(array)/sizeof(Type)
确定数组的元素个数
1.3 向函数传递数组
数组作为参数被传递到函数中时,实际上传递是数组的首地址。也就是说:数组在作为参数传递到函数中时,会自动退化为指针。这个时候,数组名就会被视为常量指针,指向数组首元素的地址(但是数组和指针本质上是两种不同的数据类型,不能完全划等号)。
原因:数组在内存中是一段连续的存储空间,而将整个数组拷贝到函数参数中可能会消耗大量的内存和时间。而编译器只要知道了数组的首地址,就可以对数组进行一系列操作。
但是函数接收数组时,其参数类型还是要写明是数组的。例如:int sum(int arr[],int len);
对于一维数组而言,不管是静态定义的还是动态定义的,参数写成指针是可以的。对于二维数组而言,假如是动态定义的,那么形参可以写成二级指针。假如是静态定义的,那么要写成int a[][col]
或者int (*a)[col]
,也就是指向一维数组的指针。
1.4 二维数组
也就是说:a[0]存储的是第一个一维行数组的首地址(
a[0][0]
的地址),a[1]存储的是第二个一维行数组的地址(a[1][0]
的地址)。对于
a[1][1]
,会先去得到a[1]
的地址,接着根据a[1][1]
知道是要找第一行中下标为1的元素。因此首地址+下标*元素长度就得到a[1][1]
的值
二维数组在内存中的存储还是线性的,如图:
1.4.1 初始化
看例子:
结果:
array1:
1, 2, 3
4 ,5 ,0
而array2:
1, 2, 0
4, 0, 0
解释:
int array2[2][3]={{1,2},{4}}
将array2的第一行初始化为1、2,剩下的则会被自动初始化为0,第二行同理。而
array1
的初始化方式相当于给出了数组的所有元素,各数组元素会依次被初始化,而其共有6个元素,因此第6个元素默认为0。
1.4.2 省略第一维大小
例子:
int a[][4]={1,2,3 4,5,6,7,8,9,10,11,12};
int a[3][4]={1,2,3 4,5,6,7,8,9,10,11,12};
第一个数组中,编译器会自动根据给定的数组元素计算出数组的行数为3。因此可以省略第一维大小
注意:
int arr[][4]={1,2,3,4,5,6,7,8,9,10,11};
//虽然11不能整除4,但是其最后一个元素值为0
int a[][4]={{1,2,3}{0},{4,5}};
等价于int a[][4]={{1,2,3}{0,0,0},{4,5,0}};
1.4.3 二维数组的降维
二维数组在内存中的存储方式实际上和一维数组一致,而一维数组在做为参数传递时,实际上传递的是数组的首地址。因此,对于函数void func(int arr[],ing len)
,可以将二维数组的首地址传入,再使用一维数组的方式区访问数组元素。
注意:不能直接把二维数组的名字传进去,因为二维数组的名字实际上是一个指针,指针和地址是不同的。传入二维数组名后就只能按照二维数组的方式去访问元素。
例如下面这段程序:
这句话没有懂
2 总结
C++,犹如编程的交响乐, 在代码的海洋中奏响和谐的旋律。
它是创造者的笔,雕刻着无尽可能,
是思想的翅膀,让梦想飞翔的天空。
无拘无束,灵活多变。
C++,是程序员心中的宝藏,永不凋零的花朵。
渴望挑战C++的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多C++的奇迹吧。我们推出了引领趋势的💻C++专栏:《C++程序设计》阅读笔记,旨在深度探索C++的实际应用和创新。🌐🔍