二维数组传参问题

二维数组传参全解

第一种方法

#include<stdio.h>
int Sort_Two_Array(int buff[][5],int num)//直接传参第一种引用方法------
{                                        //需要在函数中定义一个指针存放--首行元素地址
	int i=0;int j=0;int temp;            //适合连续元素处理,二维转一维处理
//	int *pload=buff[0];  //pload=buff;
    int *pload;
    pload=buff[0];       //pload=buff[1] 则指向第二行的首元素地址
    /*
    pload+1=buff[0]+1;   *(pload+1)=pload[1]=*(buff[0]+1)
    []是取值符,取了所指向地址的值
    pload[i],即取pload指向首地址加偏移i个地址后的值
    */
	for(i=0;i<num*5;i++)
	{
		for(j=0;j<num*5-i-1;j++)
		{
			if(pload[j]>pload[j+1])     //pload指向了buff[0],即存放了buff[0]的地址
			{                           //pload+j就是buff[0]之后的地址
				temp=pload[j];          //就是那一行的后一个数
				pload[j]=pload[j+1];
				pload[j+1]=temp;
			}
		}
	}
}
int Show_Two_Array(int array[][5],int num)//直接传参第二种引用方法---
{                                         //适合单个元素处理
	int i=0,j=0;
	for(i=0;i<3;i++)
	{
		for(j=0;j<5;j++)
		{
			printf("%4d",array[i][j]);
		}
		printf("\n");
	}
}
int Initial_Two_Array(int array[][5],int num)
{
	int i=0,j=0;
	for(i=0;i<3;i++)
	{
		for(j=0;j<5;j++)
		{
			scanf("%d",&array[i][j]);
		}
		printf("\n");
	}
}
int main(void)
{
	int load[3][5];
	Initial_Two_Array(load,3);//初始化数组
	Sort_Two_Array(load,3);//对数组排序
	Show_Two_Array(load,3);//打印数组
	return 0;
}

第二种方法

#include<stdio.h>
int sort_two_array(int *buff[],int num)//用指针数组接收
{
	int i=0;int j=0;int temp;
	int *pload=buff[0];
	for(i=0;i<num*5;i++)
	{
		for(j=0;j<15-i-1;j++)
		{
			if(pload[j]>pload[j+1])
			{
				temp=pload[j];
				pload[j]=pload[j+1];
				pload[j+1]=temp;
			}
		}
	}
}
int initial_two_array(int *array[],int num)//用指针数组接收在main函数中的指针数组首地址
{
	int i=0,j=0;
	for(i=0;i<num;i++)
	{
		for(j=0;j<5;j++)
		{
			scanf("%d",array[i]+j);
		}
		printf("\n");
	}
}
int output_two_array(int *array[],int num)
{
	int i=0,j=0;
	for(i=0;i<num;i++)
	{
		for(j=0;j<5;j++)
		{
			printf("%5d",*(array[i]+j));//array[i]--->buff[i]
		}
		printf("\n");
	}
}
int main(void)
{
	// buff &buff,buff[0],*(buff+0)
	int buff[3][5];
	//int (*pbuff[3])[5]={buff,buff+1,buff+2};
	int *pload[3]={buff[0],buff[1],buff[2]};
	initial_two_array(pload,3);//初始化数组
	sort_two_array(pload,3);//对二维数组排序
	output_two_array(pload,3);//打印数组
	return 0;
}

第三种方法

#include<stdio.h>
int sort_two_array(int(*buff)[][5],int num)
{
	int i=0;int j=0;int temp;
	int *pload= (int*)buff;//限定取值方式为跳转4个byte(整型),pload指向buff首元素地址
	for(i=0;i<num*5;i++)
	{
		for(j=0;j<15-i-1;j++)
		{
			if(pload[j]>pload[j+1])
			{
				temp=pload[j];
				pload[j]=pload[j+1];
				pload[j+1]=temp;
			}
		}
	}
}
int initial_two_array(int (*pbuff)[][5],int num)
{
	int i=0,j=0;
	int (*pload)[5]=(int(*)[])pbuff;
	int *array[]={*(pload+0),*(pload+1),*(pload+2)};
	for(i=0;i<num;i++)
	{
		for(j=0;j<5;j++)
		{
			scanf("%d",array[i]+j);
		}
		printf("\n");
	}
}
int output_two_array(int (*pbuff)[][5],int num)     //接收数组整体,即[]*[5]个地址,
{
	int i=0,j=0;                                     //接收了二维数组整体地址,在处理的时候
	int (*pload)[5]=(int(*)[])pbuff;/*分割*/         //就要将其分割,强制转换为行整体首地址
	/*将pbuff强制转化为有五个元素(列)的数组,即把整行分割出来了,此时pload即指向pbuff第一行首地址*/
	int *array[]={*(pload+0),*(pload+1),*(pload+2)};//*(pload+0)为二维数组第一行首地址
	for(i=0;i<num;i++)
	{
		for(j=0;j<5;j++)
		{
			printf("%5d",*(array[i]+j));
		}
		printf("\n");
	}
}
int main(void)
{
	// buff &buff,buff[0],*(buff+0)
	int buff[3][5];
	//int (*pbuff[3])[5]={buff,buff+1,buff+2};
	//int *pload[5]={buff[0],buff[1],buff[2],buff[3],buff[4]};
	initial_two_array(&buff,3);//初始化数组
	sort_two_array(&buff,3);//对数组排序
	output_two_array(&buff,3);//打印数组
	return 0;
}
/*
对二维数组整体地址的处理有两种方法,第一种:强制转化为int(*)型,限定跳转长度为4个byte
                                    第二种:强制转化为int(*)[]型,分割行首地址
*/
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追代码的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值