Во-первых, прямо в ответ на ваш вопрос, если вы так определяете матрицу и хотите сохранить ее указатель в строчке ct, вы можете сделать это через прямое назначение. Ведя из вашего примера, вы могли бы сделать doublePointer
члена в struct AMessage
точки в память вы выделяемая на c
просто через что-то вроде этого:
struct AMessage am;
am.doublePtr = c;
Но если Вы желаете создать матрицу, где каждая строка, как гарантируется, имеет такое же количество элементов, как и любая другая строка, лучше подходящая для представления этого, представляет собой 2D-массив, а не массив указателей на другие массивы.
2D-массив в C может быть объявлена следующим образом:
double matrix[ROW][COL];
это объявляет переменную с именем matrix
, с ROW
строк и столбцов COL
.
Там нет ничего, чтобы остановить вас в том числе это определение прямо в определении вашего struct
, что делает определение вашей структуры, как это:
struct AMessage
{
char MessageId;
double matrix[ROW][COL];
};
(Благодаря chqrlie предложившего это)
Если вы определенно хотите, чтобы указатель на 2D-массив находился в вашем struct
(например, вы можете захотеть иметь один большой массив, на который ссылаются два из ваших struct
), вам нужно знать, что 2D-массив в C действительно является 1D-массивом, только адресованные определенным образом.
Вы можете динамически выделить память для использования матрицы с одним вызовом таНоса:
double *c = malloc(ROW * COL * sizeof(*c));
Одним из вариантов для получения доступа к элементу элемента в столбце j
, строка i
является:
double a = c[ROW * j + i];
, но это, очевидно, немного неуклюжий, действительно, удобнее получить элемент i
, j
примерно таким:
double a = d[j][i];
Чтобы определить указатель d
, что мы можем разыменовать это, нам нужно подумать о том, какой тип d[j]
есть. Это не так, как многие думают, double *
, скорее это указатель на массив ROW
double
s.В синтаксисе C вы бы объявить d
так:
double (*d)[ROW];
Наконец решения вашего вопроса, я бы определил свой-структуру, как это:
struct AMessage
{
char MessageId;
double (*matrix)[ROW];
}
Присвоение этой struct
будет выглядеть примерно так:
struct AMessage am;
am.matrix = malloc(ROW * COL * sizeof(*am.matrix));
am.matrix[j][i] = 42; // Assigns 42 to row j, column i
Вы попробовали 'xMessage.doublePtr = c;'? – mch