双指针(int **)和双括号从2D数组中获取值

时间:2018-01-28 01:26:08

标签: c++ arrays matrix multidimensional-array

我觉得我在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** 1}}是指向int的指针的指针,因此它将前2个矩阵条目视为int*。然而,这让我很困惑,因为像How to pass a multidimensional array to a function in C and C++上的bobobobo这样的答案似乎表明你可以使用int**方法。我很困惑。我已经看到其他SO帖子说同样的话,为什么它对他们有用呢?

我认为matrix[0][0]它会matrix[0]的地址加上offset 0 * sizeof(int)(这仍然是第一个元素)

1 个答案:

答案 0 :(得分:2)

数组数组不是指向指针的指针,而是指向数组的指针。因此,数组int matrix[4][4]不会衰变为int **,而是变为int (*)[4]

这就是为什么你需要摆脱演员并改变RotateMatrix的签名。