Проблема в передаче 2-D массива - PullRequest
0 голосов
/ 15 февраля 2020

Я прочитал, как передавать 2-D массивы в функцию в качестве параметра, и попытался реализовать то же самое. Я столкнулся с двумя проблемами:

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);
}

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Самая большая проблема здесь в том, что вы используете C, а не C ++.

Чтобы люди не задыхались и не начинали религиозные или политические дискуссии, давайте добавим:

VLA (массивы переменной длины) не разрешены в C ++.

Кроме того, вы никогда не следует использовать необработанные указатели для собственной памяти и без арифметики с указателями c.

И затем основные топи c:

Проблема при передаче 2-D массива

Используется неверный синтаксис для передачи массивов в функцию. В 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;
}

Конечно, мы можем делать все виды грязных конструкций с указателями. Даже принимая указатель распадается. Но мы не должны делать это.

0 голосов
/ 15 февраля 2020

Массивы переменной длины не являются стандартной функцией C ++.

Тем не менее вы передали в функцию указатель на первый элемент двумерного массива.

Каждая "строка" Двумерный массив имеет n элементов. Таким образом, если у вас есть указатель на первый элемент первой строки, чтобы получить указатель на первый элемент второй строки, вы должны написать

arr + n

Если вы хотите получить первый указатель на i-ую строку двумерного массива вы должны записать

arr + i * n

Чтобы получить указатель на элемент в строке, вы должны написать

( arr  + i * n ) + j

, который совпадает с

arr + i ( n + j

чтобы получить элемент, на который указывает указатель, необходимо разыменовать указатель

*( arr + i * n + j )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...