这几天做笔试题,有个变长二维数组的传递。平时核心代码写多了,写完整函数反倒不清晰二维数组的传递了。
1.简单传参
int aa(int a[][2])
{
cout<<a[0][0]<<" "<<a[0][1]<<endl;
}
int main()
{
int a[5][2]={{1,2},{3,4}{5,6},{7,8},{9,0}};
aa(a);
}
必须明确二维的长度。一维的数字可有可无。比原来的大也可以,不写也可以。二维的数字必须准确无误。
2.指向一维数组的指针
int bb(int (*a)[2])
{
cout<<a[2][0]<<" "<<a[2][1]<<endl;
}
int main()
{
int a[5][2]={{1,2},{3,4}{5,6},{7,8},{9,0}};
bb(a);
}
和第一种差不多。同样需要确定二维的长度。
3,指针数组
int cc(int *a[])
{
cout<<a[1][0]<<" "<<a[1][1]<<endl;
}
int main()
{
int *a[2];
int b[2]={1,2};
int c[2]={3,4};
a[0]=b;
a[1]=c;
cc(a);
}
注意与2相对比。一个是指向一位数组的指针,一个是指针数组。指针数组可实现变长二维数组传递,但是主函数里必须也是指针函数。如果还是a[][] 这种形式会报错。
4.二级指针 **a
int dd(int **a)
{
cout<<*(*(a+1)+1)<<" "<<*((*a))<<endl;
}
int main()
{
int *a[2];
int b[2]={1,2};
int c[2]={3,4};
a[0]=b;
a[1]=c;
dd(a);
}
main函数里也需要使用指针数组了,同样可以实现可变长度的二维数组传递。
一开始我想的就是这个a,但是简单的用a指着a[][]会报错。然后我看到有说可以
int bb(int **a,int m,int n)
{
cout<<a[2][0]<<" "<<a[2][1]<<endl;
}
int main()
{
int a[5][2]={{1,2},{3,4}{5,6},{7,8},{9,0}};
bb((int**)a,5,2);
}
这样设计的。但是我跑不出来。求解答。
5.vector (最最最推荐的)
这里就不详细展开了。相信刷过牛客力扣的都会记忆深刻。
po一个阿里2021.4.12的笔试第一题。题目懒得给了。
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
int diGui(vector<vector<int> > &a,int n)
{
if(n==2)
{
a[0].push_back(0);
a[0].push_back(1);
a[1].push_back(1);
a[1].push_back(1);
return 0;
}
diGui(a,n/2);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i<n/2&&j<n/2) continue;
if(i<n/2&&j>=n/2) a[i].push_back(a[i][j-n/2]);
if(i>=n/2&&j<n/2) a[i].push_back(a[i-n/2][j]);
if(i>=n/2&&j>=n/2) a[i].push_back(a[i-n/2][j-n/2]);
}
for(int i=0;i<n/2;i++)
for(int j=0;j<n/2;j++)
a[i].at(j)=0;
}
int main()
{
int n;
cin>>n;
int length=pow(2,n);
vector<vector<int> > a;
a.resize(length);
diGui(a,length);
for(int i=0;i<length;i++)
{
for(int j=0;j<length;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}