В C++ многомерный инициализация массива

в C++ я хочу инициализировать двойную матрицу (2-мерный двойной массив), как я обычно делал бы без указателей, таких как:

    double data[4][4] = {
    1,0,0,0,
    0,1,0,0,
    0,0,1,0,
    0,0,0,1
};

однако, поскольку я хочу вернуться и передать его функциям, мне нужно это как double** указатель. Итак, в основном мне нужно инициализировать данные приятным способом (как указано выше), но затем мне нужно сохранить указатель на 2D-массив без потери данных при выходе функции.

любая помощь на этом? :-)

6 ответов


Если вы не особенно разборчивы в указателях, я бы предпочел ссылку здесь

void init( double (&r)[4][4]){
    // do assignment
    r[0][0] = 1;
}

int main(){
    double data[4][4] = {
        1,0,0,0,
        0,1,0,0,
        0,0,1,0,
        0,0,0,1
    };

    init(data);
}

кстати, если вы передадите его функции таким образом, вы будете "присваивать", а не "инициализировать".


все ваши матрицы 4x4? Тогда я бы просто определил класс с double[4][4] член и передавать объекты этого класса вокруг:

class Matrix
{
    double m[4][4];
    // ...
};

void function(const Matrix& matrix)
{
    // ...
}

Если вам нужны матрицы различных размеров, но они известны во время компиляции, используйте шаблон:

template <size_t n>
class Matrix
{
    double m[n][n];
    // ...
};

template <size_t n>
void function(const Matrix<n,n>& matrix)
{
    // ...
}

это избавляет вас от работы с распадом массива на указатель и делает код более читаемым IMHO.


во-первых, объявление двумерного массива неверно. Это нужно сделать следующим образом:

double data[4][4] = {  
        {1.0,0,0,0},  
        {0,1,0,0},  
        {0,0,1,0},  
        {0,0,0,1}  
    };

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

show(data);

в объявлении функции вам нужно дать аргумент в виде массива с указанием всех измерений, кроме первого. Таким образом, декларация будет выглядеть так:

void show(double arr[][4])
{
   ...
   ...
}

Это передает массив в качестве ссылки без необходимости использования указателя.

надеюсь, что это помог.


double (*)[4] отличается от double **

просто нарисуйте макет ваших двойников в памяти для обоих, и вы должны понять, почему вы не можете использовать их взаимозаменяемо.


инициализируйте временную переменную таким образом, а затем скопируйте ее в динамически выделенную память.


Как насчет этого (с указателями и делает то, что вы просили)

#include <iostream>

using namespace std;

int refer(double (*a)[4])
{
   cout<<"First value is "<<(*a)[0];
   (*a)[0] = 37;
   cout<<"changed value is "<<(*a)[0];
}

int main()
{
   double data[4][4] = {
    1.0,0,0,
    0,1,0,0,
    0,0,1,0,
    0,0,0,1
   };
   refer(data);
   return 0;
}