C/C++二维数组的参数传递与二维指针

在进行函数参数传递的时候,常常需要把一组数据传递给函数,我们知道一维数组在进行函数参数传递的时候,以数组名作为形参就可以,因为数组名就表示该数组的首地址,在函数内部也直接可以用[]符号访问。

那么二维数组的值该如何传递呢?其实它可以像一维数组那样以数组名作为形参和实参,也可以使用二级指针来进行传递,常用的方式如下:

方法一:通过数组名传递

这种方法第一维宽度可以省略,但必须指定第二维的宽度。

#include <QtCore/QCoreApplication>
#include "opencv2\opencv.hpp"
//tab[2][3]也可以写成tab[][3];但是第二维宽度不能省
void print(float tab[2][3])
{
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            cout<<tab[i][j]<<" ";
        }
        cout<<endl;
    }
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    float ta[2][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};

    cout<<"ta: "<<endl;
    print(ta);//打印

    return a.exec();
}

方法二:通过二级指针传递<1>

这种方法在函数内部可以使用[]符号访问数组元素,但是在调用函数前必须先开辟一段二级指针指向的内存,然后把数组值拷贝到这一块内存中,用完后必须手动释放内存。优点是同一个函数可以接收不同长和宽的二维数组,缺点是必须手动开辟一段内存用完后还要手动回收,并且要把二维数组的值拷贝到开辟的内存中。

#include <QtCore/QCoreApplication>
#include "opencv2\opencv.hpp"
void print(float **tab,int rows,int cols)
{
    for(int i=0;i<rows;i++){
        for(int j=0;j<cols;j++){
            cout<<tab[i][j]<<" ";
        }
        cout<<endl;
    }
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    float ta[2][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};
    float **p=new float *[2];//开辟行空间
    for(int i=0;i<3;i++)
           p[i]=new float[i];//开辟列空间
    for(int i=0;i<2;i++){    //赋值
        for(int j=0;j<3;j++){
            p[i][j]=ta[i][j];
        }
    }
    cout<<"ta: "<<endl;
    print(p,2,3);//打印
    //p的内存释放方式
    for(int i=0;i<3;i++)
        delete[]p[i];
    delete []p;
    return a.exec();
}

方法三:通过二级指针传递<2>

这种方式不仅二维数组的长和宽可以随意,而且同一个函数可以接收不同类型的数组,但是不能通过[]运算符来访问了,必须通过*运算符来访问,取值的时候必须类型强转。基于以上两个优点,本人一直都是使用这种方式。

#include <QtCore/QCoreApplication>
#include "opencv2\opencv.hpp"
void print(void **tab,int rows,int cols)
{
    for(int i=0;i<rows;i++){
        for(int j=0;j<cols;j++){
            cout<<*((float *)tab+i*cols+j)<<" ";
        }
        cout<<endl;
    }
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    float ta[2][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};
    cout<<"ta: "<<endl;
    print((void **)ta,2,3);//打印
    return a.exec();
}
 
打印输出: 

以上输出结果均为下图












评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叶落西湘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值