C++ 二维数组和指针引用

标签 c++ arrays matrix

在下面的代码中,当 arr 被传递给转置函数并检查 a 的内容作为 a[0] 时,它给出 0x00...001但不是为 arr 检查的原始地址,为什么会这样,有什么问题?。我希望 a[0] 是数组中 1 的地址,而 a[0][1] 是数组的第一个元素。请解释。

问题:

int arr[][4] = { { 1, 2, 3, 4},{ 5, 6,7,8 },{ 9,10,11,12 } };
    transpose((int **)arr, 3, 4);
    int** transpose(int** a, int m, int n)
    {
        int** output = new int*[n];
        for (int i = 0;i < m;i++)
        {
            output[i] = new int[n];
        }
        for (int i = 0;i < m;i++)
        {
            for (int j = 0;j < n;j++)
            {
                //*((output[j]) + i) = *(a[i] + j);
                //*((output[j]) + i) = a[i][j];
                output[j][i] = a[i][j];
            }
        }
        return output;
    }

抛出异常。

工作正常:

 int** output=transpose((int *)arr, 3, 4);
    print(output,3,4);
    int**transpose(int * a, int m, int n)
    {
        int** t = new int*[n];
        for (int i = 0;i < n;i++)
        {
            t[i] = new int[m];
        }
        for (int i = 0;i < m;i++)
        {
            for (int j = 0;j < n;j++)
            {
                t[j][i] = *((a + i*n) + j);
            }
        }
        return t;
    }

    void Matrix::print(int ** a, int m, int n)
    {
        for (int i = 0;i < m;i++)
        {
            for (int j = 0;j < n;j++)
            {
                std::cout << a[i][j] << ",";
            }
            std::cout << "\n";
        }
    }

最佳答案

为了使您的代码能够处理二维数组,应如下所示修改代码。

int arr[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
transpose(&arr, 3, 4);

int** transpose( int(*a)[3][4], int m, int n)
{
    int** output = new int*[n];
    for (int i = 0; i < m; i++)
    {
        output[i] = new int[n];
    }
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            //*((output[j]) + i) = *(a[i] + j);
            //*((output[j]) + i) = a[i][j];
            if (i < n && j < m )
            {
                output[j][i] = (*a)[i][j];
            }
        }
    }
    return output;

看参数声明int(*a)[3][4] .它说变量 a是指向大小为 [3][4] 的二维数组的指针。附加检查 if (i < n && j < m )确保数组访问不会越界。

它会毫无异常(exception)地工作!

关于C++ 二维数组和指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43042145/

相关文章:

c++,从txt文件中获取电话号码

c++ - Qt (C++) 将变量从对话框传递到 main.cpp

javascript - 如何为同一个键设置多个值而不覆盖以前的值?

python - 高效计算和存储相似度矩阵

python - 解释 numpy 中 dim、shape、rank、dimension 和 axis 之间的区别

c++ - 绕道绘制文本

c# - 在 C# 中将十进制数组转换为字节数组,反之亦然

Javascript:从字符串数组创建字典

c - 理解C程序高斯约当消去法

c++ - Windows 编译器上的 timespec