一、传参问题:
1.形参为二维数组, 并给定第二维长度。必须给出后面的维度大小
声明:
int findK(int arr[][3], int rows, int cols, int k);
调用:
findK(arr,n,m,k);
缺点:必须在声明中给出第二维度的大小
2.形参为指针的指针
声明:
int findK(int **arr, int rows, int cols, int k);
调用:
int main()
{
int array[][3] = {
{1, 2, 3},
{2, 3, 4},
{3, 4, 5},
};
int* a[3];
a[0] = array[0];
a[1] = array[1];
a[2] = array[2];
int ret = findK(a, 3, 3, 4);
//这里传(array, 3, 3, 4)会报错
}
参考博客:C/C++ 二维数组传参方法总结
3.使用动态数组
声明:
int findK(int **arr, int rows, int cols, int k);
调用:
int n=5,m=6,k=1;
int **p=new int*[n];
for(int i=0;i<n;i++){
p=new int [m];
}
//p初始化省略
findK(p,n,m,k)
为了避免麻烦,可以使用vector传参。
Vector version:
声明:
int findK(vector<vector<int> >a);
调用:
vector<vector<int> >a(5,vector<int>(10));
findK(a);
关于vector,参考blog C++ vector用法
二、动态创建空间:
对于一维数组:
int *p=new int[n];
对于二维数组:
创建:
int n=5,m=6;
int **p=new int*[n];
for(int i=0;i<n;i++){
p=new int [m];
}
析构:
for(int i=0;i<n;i++)
{
delete [] p[i]; // 要在指针前加[] , 否则的话 只释放p[i]所指的第一个单元所占的空间
}
delete [] p; //最后不要忘掉 释放掉开辟的指针数组
参考blog 如何在C++中动态建立二维数组(转)