前言
我们在刷力扣的时候,会遇到这样一种函数: 这个看似普通的函数的参数里面存在一个二级指针。 在上课的时候老师提过一嘴二维数组不能直接传进二级指针里面,其中的具体原因暂且不谈,只要记得这样做是会报错就行了。那既然不能直接传,这篇文章就来讲一讲到底应该怎样传参。 特别说明本篇文章感谢汤同学在研究后提供的几种思路。(就是一整个水字数)
问题是这样的
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];
}
最后总结一下,将我们正常定义的二维数组传进方法一或方法二的函数中,或者将方法三定义的数组传进最初的(带二级指针的)函数里,是没有问题的。
|