C++ 指针 多维数组传递参数

数组作为函数参数,其实就是把其第一个元素地址传递给函数。

而多维数组一般都非常困惑我们,解决好多维数组参数传递也有多种实现方法,但是我觉得还是以The C++ Programming Language这本书为标准,看看如何做吧。

C++之父的建议就是不要使用数组传递参数,而是把数组用类包起来,使用STL如:array, string,vector等。如果坚持要直接使用一般数组的话,会要应付各种隐晦的bug和令人困惑的因素。

如下是一般的传递参数方法。但是一般我们并不确定数组的维数,那怎么办呢?

void print_m35(int m[3][5])
{
	for (int i = 0; i!=3; i++) {
	for (int j = 0; j!=5; j++)
	cout << m[i][j] << '\t';
	cout << '\n';
	}
}

第一维是和定位元素(本例中是3)无关的,只是告诉我们有多少个元素(本例中是int[5], 而不是int)在数组里面。

所以可以不确定第一维,如下:

void print_mi5(int m[][5], int dim1)
{
for (int i = 0; i!=dim1; i++) {
for (int j = 0; j!=5; j++)
cout << m[i][j] << '\t';
cout << '\n';
}
}

但是还不能达到我们的要求。我们的本能反应就是如下写程序:

void print_mij(int m[][], int dim1, int dim2) // doesn’t behave as most people would think
{
	for (int i = 0; i!=dim1; i++) {
	for (int j = 0; j!=dim2; j++)
	cout << m[i][j] << '\t'; // surprise!
	cout << '\n';
	}
}

可是这确是错误的。因为m[][]非法,第二维必须让编译器知道,以定位元素。

正确的做法应该是:

void print_mij(int* m, int dim1, int dim2)
{
	for (int i = 0; i!=dim1; i++) {
	for (int j = 0; j!=dim2; j++)
	cout << m[i*dim2+j] << '\t'; // obscure
	cout << '\n';
	}
}

调用函数如下:

int test()
{
	int v[3][5] = {
	{0,1,2,3,4}, {10,11,12,13,14}, {20,21,22,23,24}
	};	
	print_m35(v);
	print_mi5(v,3);
	print_mij(&v[0][0],3,5);
}


最后一个语句也可以只用v[0]代替&v[0][0],因为两者是一样的, 但是不能使用v,这是类型错误了。

最后还是建议用类封装起来,使用vector等容器。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值