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

原创 2018年04月17日 16:40:23
要想在函数中带入一个二维数组
前提首先我们要知道二维数组在内存中是如何分布的
假设定义一个二维数组 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()

转置后


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


datatable与dataset加二维数组实现

using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;...
  • esnowxu
  • esnowxu
  • 2007-12-06 11:27:00
  • 519

c++中如何解决函数调用二维数组的问题。

1.可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略  第一维的大小说明,如:     void Func(int array[3][10]); ...
  • qq604258581
  • qq604258581
  • 2017-05-10 22:07:24
  • 1667

“作为函数参数的二维数组”即“怎么给函数传二维数组的指针”

刚才在百度知道看到了这个问题,回答了下,这个问题很好,总结一下。 声明一个二维数组 int matrix[100][100]; 当把二维数组作为参数传递的时候很多人可能一上来就这样写intf...
  • MichealTX
  • MichealTX
  • 2012-01-03 18:54:13
  • 9241

如何取出二维数组中的值,(除了使用foreach 和 for 循环)

问题:使用PHP函数:current — 返回数组中的当前单元如图:
  • liunx___
  • liunx___
  • 2018-01-02 14:37:42
  • 155

函数传递二维数组,结束函数调用

1620-7  唐大智《2016年11月7日》[连续第三十八天总结] 标题:函数传递二维数组,结束函数调用 关键词:函数调用100%,题目练习 内容(A): (1)由于二维数组名也是一...
  • tdz429581237
  • tdz429581237
  • 2016-11-07 22:55:41
  • 245

memset函数与二维数组初始化的问题

今天在编写Levenshtein distance距离函数时用到二维数组,用memset对其初始化时发生了问题,直接代码: int** m = NULL; int i = 0,j = 0; ...
  • lvhaitao
  • lvhaitao
  • 2016-03-10 19:27:29
  • 5341

c语言中函数二维数组传递方法小结

c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:方法一, 形参给出第二维的长度。例如:#include void func(int n, char  str[ ][5] ){ int ...
  • sarsjapanese
  • sarsjapanese
  • 2007-01-09 22:49:00
  • 15945

如何让C语言函数返回一个二维数组

为了让C语言函数返回一个二维数组,有些人这样定义函数: int **foo(int rows, int columns) 然后在函数中费劲心机拼出来一个这样的malloc语句: int ...
  • imred
  • imred
  • 2016-09-14 13:55:02
  • 4584

求二维数组最大最小值----利用函数调用形式(2种方法)

(1)利用冒泡排序思想求二维数组中的最大值 /* 利用函数调用形式,传递二维数组名进行函数调用 设计求二维数组中最小值、最大值的函数,在主函数中调用 利用冒泡排序思想求二维数组最大值。...
  • smallgyy
  • smallgyy
  • 2012-12-14 18:58:50
  • 4205

函数调用常规二维数组和动态二维数组的差异

博客的内容分为两个部分,第一部分解释了函数调用常规二维数组的格式,主要参照的是《C++ Prime Plus》中的7.4节。第二部分解释了动态二维数组的初始化方法,以及函数调用动态二维数组的格式。...
  • u013698770
  • u013698770
  • 2015-09-06 14:19:57
  • 954
收藏助手
不良信息举报
您举报文章:二维数组如何放到函数中使用
举报原因:
原因补充:

(最多只允许输入30个字)