二维数组形参

1 篇文章 0 订阅

1.问题:写基数排序过程中发现需要进行二维数组形参(当然可以替换其他方式解决,比如用一位数组模拟桶),发现竟然编译不能通过,错误代码大致如下:

void error_array(int **a,int m,int n)
{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			printf("%d ",a[i][j]);
		}
		puts("");
	}
}
int main()
{
    int a[2][4] = {1, 2, 3, 4,5, 6, 7, 8};
    testArray(a,2,4);
}//error: cannot convert `int (*)[4]' to `int*' for argument `1' to `void testArray(int*, int, int, int)'

2.网上提供的常见版本

void func1(int a[][3],int m,int n)//数组名作形参,3不可省去
{
	puts("-------func1-------");
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
        	printf("%d\t",a[i][j]);//
        }
        puts("");
    }
}
void func2(int (*a)[3],int m,int n)//一维数组指针(行指针)作形参,3不可省去
{
	puts("-------func2-------");
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
        	printf("%d\t",a[i][j]);//
        }
        puts("");
    }
}
void func3(int **a,int m,int n)//指针的指针作形参
{
	puts("-------func3-------");
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
        	printf("%d\t",*((int *)a+i*n+j));//a[i][j]不行
        }
        puts("");
    }
}
int main()
{
    int array[2][3]={{2,3,5},{7,11,13}};
    func1(array,2,3);
    func2(array,2,3);
    func3((int **)array,2,3);
}

 

3.另外一种新方式

3.1首先分析上面的三种方式,本质上func1、func2一样的,都是一个行指针,但是常数3不能省去;func3的取值方式不方便,尤其是更高维,综合这两种方式,提出下面的解决方案

3.2新方式

void func0(int *a,int m,int n)//int *a可写成int a,int **a,int ***a,实参对应即可
{
	puts("-------func0-------");
	int (*p)[n]=(int (*)[n])a;
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
        	printf("%d\t",p[i][j]);//
        }
        puts("");
    }
}

参考:http://blog.csdn.net/yunyun1886358/article/details/5659851


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值