关于二维数组和二级指针的传参问题

前言

我们在刷力扣的时候,会遇到这样一种函数:
在这里插入图片描述
这个看似普通的函数的参数里面存在一个二级指针。
在上课的时候老师提过一嘴二维数组不能直接传进二级指针里面,其中的具体原因暂且不谈,只要记得这样做是会报错就行了。那既然不能直接传,这篇文章就来讲一讲到底应该怎样传参。
特别说明本篇文章感谢汤同学在研究后提供的几种思路。(就是一整个水字数)


问题是这样的

//有一个二维数组,正常情况下是这样定义的:
int a[][3] = {{1,2,3}, {4,5,6}};
//然后能我们想要将这个数组传进这样的一个函数里面:
void text(int** a)
//然后呢  他报错了!!!

从函数头下手

解决不了问题那就解决提出这个问题的东西——改变函数头,让二级指针消失!那不就迎刃而解。

以下是两个可以替代二级指针的写法

方法一

void text1(int a[][10])

方法二

void text2(int (*a)[10])

以上两种写法其实质都和二级指针大差不差,所以可以在设置函数的时候进行替换。

从定义数组下手

有时候吧咱没法改变人定好的函数头,就像文章引入的那个例子一样,所以只能改变自己去解决问题。
所以又给出了第三个方法,在一开始设置数组的时候就搞点小手段:

方法三

int *a[10] = {{1,2,3}, {4,5,6}};
//这里就大概这个意思,直接这么写会报错的哈,

写到这里就不得不提一下int (*a)[10]int* a[10]的区别了。前者呢是对*p的拓展,拓展后的结果就是二维数组。而后者是一个只有十个元素的指针数组。二者的区别在于赋值时,前者可以直接当二维数组进行赋值,但后者要给十个一级指针,才能使后者拥有二维数组的值。

//解释一下给十个一级指针的意思,是这样的
//二维数组
for (i = 0; i < 10; i++) {
  for (j = 0; j < 10; j++) {
   a[i][j] = j;
  }
 }
 //给十个一级指针:
 int *p[10];
 for (i = 0; i < 10; i++) {
  p[i] = a[i];
 }

最后总结一下,将我们正常定义的二维数组传进方法一或方法二的函数中,或者将方法三定义的数组传进最初的(带二级指针的)函数里,是没有问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值