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

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

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

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

Есть какая-нибудь помощь по этому поводу? : -)

8
задан Swaroop 2 November 2016 в 10:25
поделиться

5 ответов

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

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

Между прочим, если вы передадите ее в функцию таким образом, вы будете «присваивать», а не «инициализировать».

10
ответ дан 5 December 2019 в 06:36
поделиться

Все ли ваши матрицы 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.

5
ответ дан 5 December 2019 в 06:36
поделиться

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

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])
{
   ...
   ...
}

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

Надеюсь, это помогло.

5
ответ дан 5 December 2019 в 06:36
поделиться

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

1
ответ дан 5 December 2019 в 06:36
поделиться

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

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

3
ответ дан 5 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: