c++ - 双指针 (int**) 和双括号从二维数组中获取值

标签 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** 是指向 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/

相关文章:

c++ - 将 Qt 模型/ View 与非表格数据和非表格/列表 UI 一起使用?

c++ - 从 C++ 中的 exec 命令获取字符串输出

c++ - 函数声明的返回类型中的 & 符号如何工作?

matrix - 有人可以解释 glMatrix 的 mat4.translate 函数吗?

matrix - tensorflow逐元素矩阵乘法

c++ - 我的 C++ 应用程序是否依赖于 .Net 框架?

c++ - 检查 json 数组中的每个值是否存在于其他 json 文件中

arrays - 我们在空间复杂度中考虑二维数组指针的大小是多少?

arrays - 在聚合期间从数组中删除特定对象

matrix - Lua 中令人困惑的矩阵生成示例