c/c++二维数组传入函数方法

这几天做笔试题,有个变长二维数组的传递。平时核心代码写多了,写完整函数反倒不清晰二维数组的传递了。

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;
		}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值