关于 “如何传递一个大小不定的二维数组给函数” 的一个小想法

1.如果是在堆内存中申请的二维数组

double **a=new double*[n];
for(int i=0;i<n;i++)
    a[i]=new double[m];

    此时函数参数直接写为(double **a, int n, int m)即可,可按a[i][j]访问数组元素。

2.如果是直接定义的二维数组

double a[3][3]={{2.0},{2.2,2.6},{5.2}};


    由于a[3][3]和a[3][4]的类型不一样,且都不是double**,又由于二维数组类型千千万,所以不可能通过一个个重载的方式来写函数。此时可以把函数参数写为(void *a, int n, int m)来解决。因为这种方式定义的二维数组的元素在内存中是连续排列的,所以当访问具体元素时,可以先把a强制转化为一维指针类型,再按顺序访问。

double *b=(double*)a;
double c=*(b+m*i+j);//此即a[i][j]

但这个方法有个缺点,就是void*是可以任意匹配的,你可能传个三维数组过来他也接受,所以不太安全。


注意:一、1中的a不能传给2中的函数:因为a[0]到a[n-1]存储的是地址,之后存储的不是我们的数据,如果传给2中的函数用一维数组的方式来访问的话就错了。

           二、2中的a不能传给1中的函数:首先是类型不匹配问题,其次如果强制类型转化的话也不行,因为1中的函数需要a[0]到a[n-1]存的是地址,但我们的实参中存的是数。

           三、double**会严格匹配1中的函数,而a[3][4]由于找不到严格匹配的函数,会去匹配2中的函数。


综上,同时重载这两个函数即可解决问题:void fn(double **a, int n, int m)和void fn(void *a, int n, int m)


如果读者发现问题,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值