c ++ 2d数组和指针引用

时间:2017-03-27 09:05:14

标签: c++ arrays matrix

在下面的代码中,当 arr 传递给转置函数时,如下所示检查a的内容为[0],它给出了0x00 ... 001但是没有检查 arr 的原始地址,为什么会这样,又出了什么问题?我希望a [0]是数组中的1的地址,而[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";
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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 )可确保阵列访问不会超出范围。

它没有任何例外!

答案 1 :(得分:0)

首先在你的例子中 m 是3而 n 是4,所以在转置函数中你用 n 创建输出(4 )指针然后你有从0到 m (3)的循环,所以此时输出已经有未初始化的元素(输出[3])。它崩溃的原因是你在下一个循环中使用了那个未初始化的元素。