指针和二维数组

先前已经写过二维数组的文章了,现在直接开始指针和二维数组
int B[2][3]这个二维数组可以拆分成 创建了两个一维数组
B[0] B[1]
如果我这么写 int* p = B; 你肯定知道这是不行的,因为我们讨论的是二维数组 这是一维数组的写法
是因为B相当于指向一维数组的指针(这个一维数组有三个元素)
image.png
int* p; &p = B; 经过两次解引用就可以得到二维数组的的首个元素 我们还需要再画一张图分析一下内存。
image.png
说了那么多,就是要理解上图中的的伪代码 如果你已经理解了 那么你对二维数组指针已经理解的差不多了
说了那么多 正式进入二维数组的指针应用

创建一个二维数组指针 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");
	}

}

运行截图

image.png

指针和多维数组

三维数组指针的创建

int(*p)[2][2];
还是先画一个三维数组的内存图

image.png

跟二维数组指针是基本一样的 区别在于二维数组的数组名解引用后是指向一维数组的指针 三维数组的数组名解引用后是指向二维数组的指针
基于图片中的一些指针运算和解引用 我们也可以得出三维数组的遍历公式
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);

}

运行截图

image.png

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/uncategorized/84/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 2024年11月14日 上午11:20
下一篇 2024年11月14日 上午11:30

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注