C语言之关于二维数组在函数中的调用问题

 更新时间:2022年07月13日 14:56:38   作者:红飞机上的猪  
这篇文章主要介绍了C语言之关于二维数组在函数中的调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

关于二维数组在函数中的调用问题

之前在学习二维数组的时候感觉理解起来很简单,所以理解一下就过去了,但是当自己真正的去用二维数组数组解决一些问题(特别是在函数调用二维数组的过程中)才真正发现原来使用起来还是要去注意一些细节的。废话不多说,直接上干货!

函数调用二维数组

在函数中调用二维数组的具体格式如下:

1、声明:这是声明的两种格式,在这里定义的是一个N*5的二维字符数组,各位看官一定要注意,在声明的过程中可是要将二维数组中第二个长度参数进行标明的呀。

2、定义:和声明的格式没有什么大的区别,只不过是要如果要采用第二种声明方式的话要在定义时补充完整形参名

3、如果要去在函数中只使用二维数组中的其中一个一维数组时

我的个人做法是正常的在函数声明中正常定义一个二维数组,之后再在函数申明中额外添加一个整数参数去来限定在函数中使用二维数组中具体哪一个一维数组,例子如下:

所写这个函数是为了去分别算出这个二维数组中的每一个一维数组的平均值,所以我在定义函数时加了一个n来表示我要算哪一个一维数组的平均值。

4、在结构体中千万不要去使用二维数组!!!

当初我在写结构体是想当然的去使用了二维数组,结果。。。

如果在使用结构体的过程中需要用到类似于二维数组的储存数据的特性时,我们应当去选取用结构体数组来解决相应的问题。结构体数组相当一二维数组的一维数组,结构体中所定义的一些信息精细化相当于二维数组中一维数组的信息。

好了,这就是我这个小白中的小白在实际使用的过程中所出现的一些情况。

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

要想在函数中带入一个二维数组

前提首先我们要知道二维数组在内存中是如何分布的

假设定义一个二维数组 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()

转置后

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • 8皇后问题的解法实例代码

    8皇后问题的解法实例代码

    8皇后问题的解法实例代码,需要的朋友可以参考一下
    2013-03-03
  • C语言实现进程5状态模型的状态机

    C语言实现进程5状态模型的状态机

    状态机在实际工作开发中应用非常广泛,用这幅图就可以很清晰的表达整个状态的流转。本篇通过C语言实现一个简单的进程5状态模型的状态机,让大家熟悉一下状态机的魅力,需要的可以参考一下
    2022-10-10
  • C语言安全之数组长度与指针实例解析

    C语言安全之数组长度与指针实例解析

    这篇文章主要介绍了C语言安全之数组长度与指针,需要的朋友可以参考下
    2014-07-07
  • C++对象的动态建立与释放详解

    C++对象的动态建立与释放详解

    我们知道可以用new运算符可以动态的分配内存,用delete运算符可以释放这些内存。当我们使用new运算符动态的分配一个内存之后,会自动返回一个该内存段的起始地址,也就是指针。
    2013-10-10
  • C++11/14的新特性(更简洁)

    C++11/14的新特性(更简洁)

    这篇文章主要介绍了C++11/14的新特性(更简洁),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • C语言实现桶排序的方法示例

    C语言实现桶排序的方法示例

    这篇文章主要介绍了C语言实现桶排序的方法,简单描述了桶排序的概念、原理并结合实例形式分析了C语言实现桶排序算法的具体操作技巧,需要的朋友可以参考下
    2018-01-01
  • C语言实现飞机售票系统

    C语言实现飞机售票系统

    这篇文章主要为大家详细介绍了C语言实现飞机售票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • OpenCV实现更改图片颜色功能

    OpenCV实现更改图片颜色功能

    这篇文章主要为大家详细介绍了如何利用OpenCV实现更改图片颜色的功能,文中代码介绍详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C语言深入探究函数的溯源

    C语言深入探究函数的溯源

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数
    2022-04-04
  • C语言实现abs和fabs绝对值

    C语言实现abs和fabs绝对值

    这篇文章主要介绍了C语言实现abs和fabs绝对值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论