本博客主要内容为 “小甲鱼” 视频课程《带你学C带你飞》【第一季】 学习笔记,文章的主题内容均来自该课程,在这里仅作学习交流。在文章中可能出现一些错误或者不准确的地方,如发现请积极指出,十分感谢。
也欢迎大家一起讨论交流,如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(。・∀・)ノ゙
1. 二维数组
回顾 《15. C语言 – 二维数组》 中的内容可以知道,C 语言没有真正意义上的二维数组。二维数组的实现,只是简单地通过“线性扩展”的方式进行。如图所示,int b[4][5]; 就是定义 4 个元素,每个元素都是一个包含 5 个整型变量的一维数组。它在内存中依然是以线性的形式存储。
2. 关于数组的三个问题
假设我们定义了二维数组array[4][5],为了方便理解,使用如下的形式进行表述
2.1 array 表示的是什么?
显然同一维数组一样, array 是整个二维数组的首地址;在一维数组中,数组名是数组中第一个元素的地址,但是在二维数组中,数组名是第一行元素的地址。其实这个也很好理解,可以将整个二维数组当作是一个一维数组,那么一维数组中的每一个元素就是 array 中的一行。下面将通过代码的形式进行验证
#include <stdio.h>
int main()
{
int array[4][5] = {
0};
printf("sizeof int: %d\n", sizeof(int));
printf("array: %p\n", array);
printf("array + 1: %p\n", array + 1);
return 0;
}
我们初始化了一个全为 0 的数组,首先打印出了整型在内存中的大小,之后打印出 array 的地址,和 array 的下一个位置的地址。如果 array 指向的是数组中的第一行,那么 array 将指向数组中的第二行,array 与 array 之间差就是 5*sizeof(int),也就是指针 array 的步长为 5 。执行上述代码可以得到如下的结果
sizeof int: 4
array: 0x7ffcebf6e700
array + 1: 0x7ffcebf6e714
整型在内存中的大小为 4 ,而 array + 1 与 array 的差正好是 20。所以很明显,array 确实是数组中第一行元素的指针。
2.2 *(array+1)表示的是什么?
*(array+1) 称为 (array+1) 的解引用,也就是之前所讲的取值。我们可以从两个角度对他进行理解。首先从解引用的角度,从上面你得分析可以知道,array 是数组中第一行元素的指针,也就是说 array 的地址是数组的首地址,步长是数组中每一行元素的个数。因此 array + 1 所表示的数组的第二行的指针,对它进行解引用,实际上就是对 array