首页 > 解决方案 > 传递二维数组的问题

问题描述

我阅读了如何在函数中将二维数组作为参数传递并尝试实现它。我遇到了两个问题:

1)代码输出的第一行包含垃圾值。2) ((arr + i n) + j) 行实际上做了什么?我的意思是,为什么我们不能做类似( (arr + i) + j) 的事情来访问 arr[i][j] ?

我还尝试使用参数 int **arr 传递矩阵,然后尝试将值打印为 arr[i][j] 但没有输出。

这是我得到的输出:-

Enter number of nodes: 4
0167772161878012032-1
0000
0000
0000

这是我的代码:-

#include <iostream>
using namespace std;

void show(int* arr, int n)
{
    int i, j;

    for(i = 0; i < n; ++i)
    {
        for(j = 0; j < n; ++j)
        {
            cout << *((arr + i*n) + j);
        }

        cout << endl;
    }
}

int main()
{
    int n, i, j;

    cout << "Enter number of nodes: ";
    cin >> n;

    int arr[n][n] = {{0}}; //Will initialize all elements in the matrix with 0.

    show((int*)arr, n);
}

标签: c++pointersmultidimensional-arraypointer-arithmetic

解决方案


这里最大的问题是您使用的是 C 而不是 C++。

为了避免人们喘不过气来并开始宗教或政治讨论,让我们把它归结为:

C++ 中不允许使用 VLA(可变长度数组)。

此外,您永远不应该对拥有的内存使用原始指针,也不要使用 pinter 算法。

然后是主题:

传递二维数组的问题

用于将数组传递给函数的语法是错误的。在 C++ 中,数组可以通过引用或指针传递。请参见:

void function1(int(&m)[3][4])   // For passing array by reference
{}
void function2(int(*m)[3][4])   // For passing array by pointer
{}

int main()
{
    int matrix[3][4]; // Define 2 dimensional array

    function1(matrix);  // Call by reference
    function2(&matrix); // Call via pointer 
    return 0;
}

当然,我们可以使用指针进行各种脏设计。即使接受指针也会衰减。但我们不应该这样做。


推荐阅读