C/C++ 语言系列(五)复合数据类型之数组
一维数组
一维数组声明:type arrayName[ arraySize ];
1 | // 声明数组 |
一维数组初始化:
1 | // 初始化数组 |
一维数组访问:
1 | // 通过索引逐个访问数组元素,并赋值 |
多维数组
多维数组声明:type name[ size1 ][ size2 ]...[ sizeN ];
1 | // 声明一个三维 5 . 10 . 4 整型数组 |
二维数组初始化:
1 | // 多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。 |
二维数组访问:
1 | for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) |
二维数组大小及长度获取:
1 | // 数组总大小:48 |
数组名
数组名是指向数组中第一个元素的常指针(常量指针),因此 arrayName
等价于 &arrayName[0]
,验证如下:
1 | int arrayName[] = {0, 1, 2, 3, 4}; |
由于数组是常指针,因此自身无法执行算术运算:
1 | // 表达式必须是可修改的左值 |
数组构成
- 存储一个固定大小的相同数据类型元素的顺序集合。
- 由连续的内存地址组成。
验证如下:
1 | for (int i = 0; i < 5; i++) { |
输出如下:
1 | 0x7ffeec364620 |
分析上述输出结果,由于 1 个内存单元的大小是 8 bits
,即一个字节。而一个 int
类型的变量占用 4 个字节,因此上述 16 进制表示的内存地址的递增步长为 4。
获取数组大小
通过 sizeof
运算符,确认该数组大小为 20 字节:
1 | sizeof(arrayName) // 20 |
获取数组长度
sizeof
运算符用于获取变量的存储大小(即所占内存字节数),由于数组中每个元素的类型都是一样的、所占字节数亦然,因此可以计算如下:
1 | sizeof(arrayName) / sizeof(arrayName[0]); // 5 |
遍历数组元素
使用数组索引访问数组元素:
1 | for (int i = 0; i < 5; i++) { |
指针数组 VS 数组指针
指针数组
指针数组,表示“存储指针的数组”,即定义一个数组,其每个元素都是指针:
1 | int *p1[10]; |
数组指针
数组指针,表示“指向数组的指针”,即定义一个指针,指向数组:
1 | int *p2 = new int[10]; |
常用于定义函数的形式参数:
1 | void func(int *p); |
优点:数组作为常指针不能执行算术运算,但数组指针可以。下面通过递增指针,以顺序访问数组元素:
1 | int arrayName[5] = {1, 2, 3, 4, 5}; // &arrayName = 0x7ffee7376620 |
传递数组给函数
三种方式
有三种方式传递数组给函数。
方式一:形式参数是一个数组指针(指向数组的指针)。
1 | void func(int *p) |
方式二:形式参数是一个已定义大小的数组。
1 | void func(int p[5]) |
方式三:形式参数是一个未定义大小的数组。
1 | void func(int p[]) |
注意点
无论使用何种方式,函数内都无法获取数组长度,需要使用单独变量将数组长度作为参数传入。
1 | void func(int p[], int length) |