gpt4 book ai didi

c++ - 将二维数组传递给函数

转载 作者:太空狗 更新时间:2023-10-29 23:47:57 28 4
gpt4 key购买 nike

与其说是“如何将它传递给函数?”,不如说是一个问题。而是“这可以接受吗?”

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;

甚至使用 **pArr?

最佳答案

你在这里感到困惑。 int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}}; 不是指向数组的指针长度 3。它是一个 9 int 长的单一固态内存块,它会衰减为一个单一的 int*。编译器为您对这 block 内存进行 3*first+second 映射。

函数中的下标无效的原因是函数无法确定数组的维数。对于一维数组,您不需要此信息——您只需将索引添加到给定的基指针。但是,对于二维数组,您需要维度来计算最终索引。

ptr[0][1] = 5; 在你的函数中被翻译成 *((*(ptr + 0)) + 1) = 5; ,这显然不是您想要的,因为 arr 不是指针数组。

编辑:回应评论:

ptr[0][1] does overwrite the information in cell [0][1] of the array

是的,您在这里很幸运 - 这就是原因。当您将数组传递给您的函数时,您传递了 (&pArr[0])[1],它是指向数组第一个元素的指针。当您执行 *((*(ptr + 0)) + 1) = 5; 时,ptr+0 变为空操作,留下 *(* ptr + 1) = 5;,它在给定输入数据的情况下确实具有明确定义的行为(它将 arr 视为一维数组)。但是,如果您尝试更改下标的第一个维度,它就会爆炸。

关于c++ - 将二维数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186074/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com