二维数组如何放到函数中使用

版权声明:喜欢可以转载哦,声明一下哈 https://blog.csdn.net/QQ1910084514/article/details/79976659
要想在函数中带入一个二维数组
前提首先我们要知道二维数组在内存中是如何分布的
假设定义一个二维数组 arr[3][3];
内存中的是这样储存的:

图解:


也就是说,二维数组的内存关系是连续的,因此如果我们在函数中带入一个数组只需要数组的第一排第一个元素的地址行数列数三个条件

下面以一个二维矩阵的转置为例:

关键点是如何利用二维数组的第一排首元素的地址去把整个数组表示出来

假设:

数组 int arr[3][3];

arr的值为第一排首元素地址

已知行列数为3,令int *p=arr;

可以用 *(p+i*3+j)表示第i排第j列的元素

因此函数只需要定义一个接收数组第一排首地址元素的指针类型的形参即可

下面见完整代码:

#include<stdio.h>
#include<windows.h>
void Array_transpose(int *arr, int rank)//rank为数组的列数  代表每排有多少个元素
{
	int i;
	int j;
	int temp;//temporary 临时的
	for (i = 0; i < rank; i++)
	{
		for (j = 0; j < i; j++)
		{
			//交换沿着对角线对称的两个数的值
			//交换方法一
			/* *(arr + j * rank + i)=*(arr + j * rank + i)+*(arr + i * rank + j);   
			 *(arr + i * rank + j)=*(arr + j * rank + i)-*(arr + i * rank + j);   
			 *(arr + j * rank + i)=*(arr + j * rank + i)-*(arr + i * rank + j); */
			
			//交换方法二
			 *(arr + j * rank + i)=*(arr + j * rank + i)^*(arr + i * rank + j);
			 *(arr + i * rank + j)=*(arr + j * rank + i)^*(arr + i * rank + j);
			 *(arr + j * rank + i)=*(arr + j * rank + i)^*(arr + i * rank + j);

			//交换方法三
			/* temp = *(arr + j * rank + i);
			 *(arr + j * rank + i) = *(arr + i * rank + j);
			 *(arr + i * rank + j) =temp;*/
		}
	}
}
//配图解:



int main()
{
	int a[5][5]=
	{
		0,0,1,0,0,
		0,0,1,0,0,
		0,0,1,0,0,
		0,0,1,0,0,
		0,0,1,0,0

	};
	int i, j,s;
	
	Array_transpose(a, 5);

		for (i = 0; i < sizeof(a)/sizeof(a[0]); i++)
		{
			//	 sizeof(a)/sizeof(a[0])得数组的有多少排
			for (j = 0; j < sizeof(a[0])/ sizeof(a[0][0]); j++)
 			//	 sizeof(a[0])/ sizeof(a[0][0])得到的是第一排的元素个数
			{
				if (a[i][j])
					printf("▇");
				else
				{
					printf("  ");
				}
			}
			printf("\n");
		}
	
	system("pause");
	return 0;
}

代码实现的功能:

不使用

Array_transpose()

原本输出应该是这样


使用Array_transpose()

转置后


利用代码中的方法可以实现二维数组的转置,可以作为俄罗斯方块的色块变化方向的基础


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页