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()

转置后

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

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

(0)

相关推荐

  • 从头学习C语言之二维数组

    目录 二维数组: 语法: 二维数组存放方式: 二维数组的访问: 二维数组的初始化: 示例: 总结 二维数组: 引入一个想法: 一个变量:相当于一个点. 一维数组(也就是数组):点汇聚成为一条直线. 二维数组:直线汇聚成一个平面. 三维数组:平面汇聚成立体图形. 语法: 类型 数组名[常量表达式][常量表达式] int a[6][6];//6*6,6行6列 char b[4][5];//4*5,4行5列 double c[6][3];//6*3,6行3列 二维数组存放方式: 二维数组的访问: 数组

  • C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n", i, str[i]); } void main() { char* p[3]; char str[][5] = {"abc&quo

  • C语言数组的各种操作梳理

    目录 一.一维数组 1.创建 2.初始化 3.使用 4.数组在内存中的存储 5.数组大小的计算 二.二维数组 1.创建 2.初始化 3.使用 4.二维数组在内存中的存储 三.数组作为函数参数 1.关于数组名是数组首元素的地址的两个例外 2.冒泡排序 一.一维数组 1.创建 //如何创建数组 int num[10]; char arr[10]; double sum[10]; float fix[10]; //变长数组 //数组的大小是变量 //C99语法支持 int a = 10; int ar

  • C语言二维数组的处理实例

    复制代码 代码如下: char finalPathSet[256][256]; char middlePathSet[256][256]; int finalSetSize=0; int middleSetSize=0; int addToPathSet(char path[]){    strcpy(middlePathSet[middleSetSize],path);    middleSetSize++;}int meetPathSet(){    char tempPathSet[256

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

    目录 关于二维数组在函数中的调用问题 函数调用二维数组 二维数组如何放到函数中使用 下面以一个二维矩阵的转置为例 关于二维数组在函数中的调用问题 之前在学习二维数组的时候感觉理解起来很简单,所以理解一下就过去了,但是当自己真正的去用二维数组数组解决一些问题(特别是在函数调用二维数组的过程中)才真正发现原来使用起来还是要去注意一些细节的.废话不多说,直接上干货! 函数调用二维数组 在函数中调用二维数组的具体格式如下: 1.声明:这是声明的两种格式,在这里定义的是一个N*5的二维字符数组,各位看官一

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • C语言面试C++二维数组中的查找示例

    目录 二维数组中的查找 面试题3: 暴力遍历 动态基点操作 二维数组中的查找 面试题3: 似题: 我做过这个类似的有杨氏矩阵为背景的,实际上是一样的 暴力遍历 二维数组暴力遍历的话时间复杂度为O(n2) 虽然暴力但是应付学校考试这个就是一把好手 #include<stdio.h> //const 就是因为二维数组是定死的 int search(const int arr[4][4], int num,unsigned int* prow,unsigned int* pcol) { int i

  • 详解Java中一维、二维数组在内存中的结构

    前言 我们知道在Java中数组属于引用数据类型,它整个数组的数组元素既可以是基本数据类型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 这些),也可以是引用数据类型的.当它的数组元素是基本数据类型时,这个数组就是一个一维数组:当它的数组元素是引用数据类型时,它就是一个多维数组.比如,在一个数组中它的某个元素值其实是一个一维数组,而其他不同的元素也各自包含了一个一维数组,我们就把这个包含很多个一维数组的数组叫做二维数组

  • C语言二维数组几种常用的表示方法

    名称:二维数组的几种表示方法 说明:常用的有以下几种二维数组的表示方法: (1).第一种是普通的二维数组的表示方法. (2).第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要简单些,只要不用进行地址转换. (3).第三种表示是用指针数组.本例中的c[i]中的元素其实是地址.这种方法对各个元素大小不一样的情况下比较适用.如:假定有若干个不等长字符串需要我们处理,如果使用a [i ][j]结构,则j必

  • Golang二维数组的使用方式

    ★二维数组的使用方式: 先声明或者定义,再赋值 1)语法:var 数组名[大小][大小]类型 2)比如:var arr[2][3]int[][] 两行三列的二维数组 ★二维数组的遍历 1)双层for循环 2)for-range方式完成遍历 package main import ( "fmt" ) func main() { //演示二维数组的遍历 var arr3 = [2][3]int{{1,2,3},{4,5,6}} //for循环来遍历 for i :=0;i < len

  • C语言详细讲解多维数组与多维指针

    目录 一.指向指针的指针 二.二维数组与二维指针 三.数组名 四.小结 一.指向指针的指针 指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值 为什么需要指向指针的指针? 指针在本质上也是变量 对于指针也同样存在传值调用与传址调用 下面看一个重置动态空间大小(从 size 到 new_size)的代码: #include <stdio.h> #include <malloc.h> int reset(char** p, int size, int

  • C++数组指针和二维数组详情

    目录 1.二维数组 2.数组指针和二维数组 1.二维数组 对于一维数组,int arr[10]; arr是数组名,也是首元素的地址,&arr是数组的地址,那么对于二维数组 int arr[3][3], arr可以肯定是数组名,那么他是不是首元素的地址呢?如果是首元素的地址,那么arr[0]又该是什么呢?通过以下代码进行验证: #include <stdio.h> #define ROW 3 #define COLUMN 3 int main() { int arr[ROW][COLUM

  • Java如何将二维数组转化为一维数组

    目录 将二维数组转化为一维数组 一维数组转化为二维数组 将二维数组转化为一维数组 1. 为了偷懒所以我写了一个随机生成二维数组的函数 /* * 自动创建随机为100以内的二维数组: int nums[x][y] * */ public static int[][] CreatedDemArray(int x,int y){ int nums[][]=new int[x][y]; for(int i=0;i<nums.length;i++){ for(int j=0;j<nums[i].leng

随机推荐