Двухмерный массив как параметр функции c++

368
28 мая 2017, 22:31

Как передать двухмерный массив в функцию как параметр? пытался сделать ссылку, но выдает ошибку. Код программы ниже.

#include <iostream>
#include <windows.h>
using namespace std;
void minmax (int *a);
int main (){
    int a [5][5] = {{5, 2, 5, 3, 7},
                   {-6,-1, -5, -7, -8},
                   {2, -6, -7, 4, 10},
                   {5, -1, -7, -5, 4},
                   {7, -4, -1, -4, 8}};
    for(int i=0; i<5; i++){
        for(int j=0; j<5; j++){
            cout<<a[i][j]<<"\t";
        }
        cout<<endl;
    }
    minmax(*a);
    system ("pause");
    return 0;
}
void minmax (int *a){
    /*/Минимум по строке и максимум среди них/*/
    int minim, min[5];
        for(int i=0; i<5; i++){
        minim=a[i][0];  
        for(int j=0; j<5; j++){
            if (minim>a[i][j]){minim=a[i][j];}
        }
        min[i]=minim;   
    }
    cout<<endl<<"minimum po stroke: ";
    minim=min[0];
        for(int i=0; i<5; i++){
        cout<<min[i]<<"\t";
        if(minim<min[i]){minim=min[i];}
        }
    cout<<endl<<"Alpha = "<<minim<<endl;
}
Answer 1

Если вы хотите передавать именно как двумерный массив - то надо указать как минимум вторую размерность, типа:

void f(int a[][5]);

Ну, или ясно указать обе размерности.

Но почему бы вам не воспользоваться возможностями C++ и не использовать что-то типа vector или array?

Answer 2
  1. Если передаёте двумерный массив как простой указатель, то при вызове функции Вы должны ей подсунуть именно адрес на ячейку: не minmax(*a); а minmax(&a[0][0]);

  2. Внутри функции Вы уже не можете использовать 2 индекса, т.к. передали только указатель на число (одномерный массив). Вместо этого Вам нужно использовать одномерный индекс: a[j + n*i], где n - это количество столбцов в двумерном массиве. Так можно делать, т.к. статические массивы хранятся одним куском и складываются в памяти строками (да, и не нужно использовать "магические" числа в тексте программы (например, у Вас верхний передел для циклов) - это создает очень много проблем при попытках изменить программу. Лучше использовать для этого один раз заданные переменные.

Но вообще, лучше вообще не использовать статические двумерные массивы. Лучше перейти к динамическим массивам. Либо, если программа на С++, то можно использовать контейнеры STL (тот же vector).

READ ALSO
Что такое мультисписок?

Что такое мультисписок?

Я долго всматривался в эту картинку и пытался понять, что же такое мультисписок, но до сих пор не понимаю, как это реализовать

388
помогите перевести код с С++ на С#

помогите перевести код с С++ на С#

Задача по структурам поля № авиарейса время полета время прилета направление марка самолета расстояние вывести данные об авиарейсе с максимальной...

294
что такое system(&ldquo;pause&rdquo;)

что такое system(“pause”)

что такое system("pause") как оно работает и для чего оно нужно

431
Глобальная перегрузка cout

Глобальная перегрузка cout

Можно ли как-то глобально перегрузить cout <<? Причем сама перегрузка должна зависить от содержимого параметров коммандной строкиЧто порекомендуете?

279