我以为我在 C 风格的数组方面还不错,显然不是。我想不通。
假设我声明了一个函数
void RotateMatrix(int ** matrix, int n)
{
auto x = matrix[0][0];
}
(假设矩阵是正方形)。从主函数驱动它
void main()
{
int matrix[4][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
RotateMatrix((int**) matrix, 4);
}
基本上,matrix[0][1]
会导致缓冲区溢出。对其进行调试,matrix[0][0]
尝试转到地址 0x0000000200000001
,这是数组中前 8 个字节的组合,大概是因为 int 是 4 个字节,并且int*
是 8 个字节,int**
是指向 int 指针的指针,因此它将前 2 个矩阵条目视为 int*
。然而,这让我感到困惑,就像 bobobobo 在 How to pass a multidimensional array to a function in C and C++ 上的回答一样似乎表明您可以使用 int**
方法。我很困惑。我看到其他 SO 帖子也说了同样的话,那么为什么它对他们有用?
我认为 matrix[0][0]
它会做 matrix[0]
的地址加上 offset 0 * sizeof(int)
(这仍然是第一个元素)
最佳答案
数组的数组不会衰减为指向指针的指针,而是衰减为指向数组的指针。所以数组 int matrix[4][4]
不会衰减到 int **
,而是衰减到 int (*)[4]
。
这就是为什么您需要摆脱强制转换并更改 RotateMatrix
的签名的原因。
关于c++ - 双指针 (int**) 和双括号从二维数组中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48482280/