в C ++ я хочу инициализировать двойную матрицу (двумерный двойной массив), как я обычно делал бы без указателей, например:
double data[4][4] = {
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
Однако, поскольку я хочу вернуть и передать его функциям, он мне нужен как указатель double **
. Итак, в основном мне нужно правильно инициализировать данные (как указано выше), но потом мне нужно сохранить указатель на 2D-массив без потери данных при выходе из функции.
Есть какая-нибудь помощь по этому поводу? : -)
Если вы не разбираетесь в указателях, я бы предпочел ссылку здесь
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 **
Просто нарисуйте расположение ваших двойников в памяти для обоих, и вы должны понять, почему вы не можете использовать их как взаимозаменяемые.