这不是一个问题,“我如何将它传递给函数?”而是,“这可以接受吗?”On将2D阵列传递给函数
void func(int **ptr);
int main(int argc, char* argv[])
{
int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}};
int *pArr = *arr;
(&pArr[0])[1] = 3;
func(&pArr);
cin.get();
return 0;
}
void func(int **ptr)
{
cout << "In func()" << endl;
ptr[0][1] = 5;
}
这可以工作,据我所知。它对我来说并不安全,但我更喜欢它将2D数组传递给函数。相反,一个指针可以为我完成这项工作。
这对于那些必须阅读我的代码的人来说会非常困惑吗?我应该使用其他方法吗?使用指向数组的指针是不是一个好主意?
此外,问题有点偏题。我为什么可以这样写:
int arr[] = { 1, 2, 3, 4, 5 };
int *pArr = *arr;
但为什么我不能写
int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}};
int *pArr = **arr;
甚至用**帕尔?
感谢您的信息,但我不完全理解你的意思。 ptr [0] [1]确实覆盖了数组的单元[0] [1]中的信息,那么这不是我想要的? 然后,如果数组仅仅是一个9个单元的块,那么我真的可以使用一个指向数组的元素0..7的指针,而不是这样做吗?所以我基本上过分复杂的整个事情? – IAE 2010-07-06 12:30:48
@SoulBeaver:是的。 'arr'衰变成一个'int *',而不是'int **'。我在回答中回复了您评论的第一部分。 – 2010-07-06 12:42:14
我已经低估了这个答案,因为答案和回答者关于衰变的评论都是错误的。 'arr'不是一个指向内存的指针,但它本身就是一个内存块(如果它是一个指针,它不需要衰减)。它衰变为'int(*)[3]',而不是'int *'。对于这个问题,我想说整个'(&pArr [0])[1]'和'pArr [1]'是一样的。我怀疑他想编写'(&pArr)[0] [1]'来模拟在函数中完成的访问。但是他的整个代码对我来说没有意义。我怀疑他很困惑。请更正答案,我会收回我的downvote,队友。 – 2010-07-06 13:05:09