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

double pointer (int**) and double brackets to get the value from a 2D array

本文关键字:2D 数组 用于 获取 指针 int      更新时间:2023-10-16

我以为我在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** 是指向 ints 指针的指针,因此它将前 2 个矩阵条目视为int*。然而,这让我感到困惑,因为像 bobobobo 关于如何将多维数组传递给 C 中的函数的答案C++似乎表明您可以使用int**方法。我很困惑。我看到其他SO帖子也说了同样的话,那么为什么它对他们有用呢?

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

数组

的衰减不是指向指针的指针,而是衰减为指向数组的指针。所以数组int matrix[4][4]衰变成int **,而是衰变成int (*)[4]

这就是为什么您需要摆脱演员表并更改RotateMatrix的签名。