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