在进行函数参数传递的时候,常常需要把一组数据传递给函数,我们知道一维数组在进行函数参数传递的时候,以数组名作为形参就可以,因为数组名就表示该数组的首地址,在函数内部也直接可以用[]符号访问。
那么二维数组的值该如何传递呢?其实它可以像一维数组那样以数组名作为形参和实参,也可以使用二级指针来进行传递,常用的方式如下:
方法一:通过数组名传递
这种方法第一维宽度可以省略,但必须指定第二维的宽度。
#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();
}
打印输出:
以上输出结果均为下图