先前已经写过二维数组的文章了,现在直接开始指针和二维数组
int B[2][3]这个二维数组可以拆分成 创建了两个一维数组
B[0] B[1]
如果我这么写 int* p = B; 你肯定知道这是不行的,因为我们讨论的是二维数组 这是一维数组的写法
是因为B相当于指向一维数组的指针(这个一维数组有三个元素)
int* p; &p = B; 经过两次解引用就可以得到二维数组的的首个元素 我们还需要再画一张图分析一下内存。
说了那么多,就是要理解上图中的的伪代码 如果你已经理解了 那么你对二维数组指针已经理解的差不多了
说了那么多 正式进入二维数组的指针应用
创建一个二维数组指针 and 遍历
int (*p)[3];可以这么理解这个指针指向了存放了三个整型数组的内存地址(数组名)
B[i][j] = (B[i]+j)=*(*(B+i)+j)
#include<stdio.h>
int main()
{
int B[2][3] = { {2,4,6},
{8,10,12}
};
printf("数组B[0]的地址是%d\n", &B[0]);
printf("数组B[1]的地址是%d\n", &B[1]);
for (size_t i = 0; i < 2; i++)
{
for (size_t j = 0; j < 3; j++)
{
printf("数组B[%d]的值为 %d ", i, *(*(B + i) + j));
}
printf("\n");
}
}
运行截图
指针和多维数组
三维数组指针的创建
int(*p)[2][2];
还是先画一个三维数组的内存图
跟二维数组指针是基本一样的 区别在于二维数组的数组名解引用后是指向一维数组的指针 三维数组的数组名解引用后是指向二维数组的指针
基于图片中的一些指针运算和解引用 我们也可以得出三维数组的遍历公式
C[i]=*(C+i) //返回指向二维数组的指针 所以如果打印这个映射在内存图上 就表示第i个二维数组的首地址 如果i是0则是800 如果是1 则是816
*(C[i]+j) =* (*(C+i)+j) //返回的是指向一维数组的指针 所以如果打印这个映射在内存图上 就表示第j个一维数组的首地址 如果j是0则表示是第i个二维数组的第j个一维数组的首地址
*(C[i][j]+k)=*(* (*(C+i)+j)+k)//返回的是第i个二维数组的第j个一维数组的第k个元素
接下来我就用一个函数讲解多维数组传参和遍历
#include<stdio.h>
void print(int (*BP)[2][3])
{
for (size_t i = 0; i < 2; i++)
{
for (size_t j = 0; j < 2; j++)
{
for (size_t k = 0; k < 3; k++)
{
printf("B[%d][%d][%d]=%d\n", i, j, k, *(*(*(BP + i) + j) + k));
}
}
}
}
int main()
{
int B[2][2][3] = {
{{1,2,3},{4,5,6}},
{{7,8,9},{10,11,12}}
};
print(B);
}
运行截图
网站标题:CV鼻祖洋芋
原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/uncategorized/84/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!