1.深入了解二维数组
在上一节3.8中,对于二维数组的笔记中我觉的还缺少一些基础性建设,所以在此进行补充。
(引用千锋教育基础班笔记的一些记录)
arr[1] => *(arr+1) 第一行第0列的列地址
&arr[1] => &*(arr+1) =>arr+1 第1行的行地址
*(arr+1) => 第0行第1列的列地址
arr[1]+2 => *(arr+1)+2 => 第1行第2列的列地址 (参照第一个是第一行,就是第二行其实,数组里面是从0开始,前面还有给第0行,+2就是列地址加2,跳过一个字符的大小,之前有了解过的知道,)
**arr == *(*(arr+0)+0) == arr[0][0]
数组是从0开始的,二维就是从0行0列开始(也就是我们实际问题中的第一个,程序中通常对数组说的第0就是第1。)
2.二维数组和一位数组指针的关系
在 C/C++ 中,二维数组可以视为一维数组的数组。也就是说,二维数组可以看作由多个一维数组组成的数据结构。因此,我们可以使用一个一维数组指针来表示二维数组。
具体来说,假设有一个二维数组 int arr[m][n]
,其中 m
表示行数,n
表示列数,则可以定义一个对应的一维数组指针 int (*p)[n]
。
通过指针的运算和解引用操作,我们可以使用一维数组指针来访问二维数组中的元素。例如,*(p+i)
表示第 i
行的一维数组指针,*(*(p+i)+j)
表示第 i
行第 j
列的元素。
需要注意的是,二维数组和一维数组指针的类型不完全相同。二维数组的类型是 int [m][n]
,而一维数组指针的类型是 int (*)[n]
。因此,在进行类型转换或进行指针运算时,需要确保类型匹配。
二维数组和一维数组指针之间的关系:二维数组是由一维数组组成的,而一维数组指针可以用来表示和操作二维数组。
int arr[n]; int *p;
int arr[n][m]; int (*p)[m];
int arr[n][m][k]; int (*p)[m][k]
n维数组 和 n-1维的数组指针 等价
3.多维数组的物理存储
无论是一维数组还是多维数组,它们都以线性的方式进行存储,也就是在物理上是一维存储的。对于多维数组,它们在逻辑上可以被视为具有多个维度的数组。
用一维的方式去遍历二维的数组