Использование индексов с указателем без разыменования - PullRequest
1 голос
/ 30 мая 2019

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

/* make an identity matrix of ints */
real      **id_mat(int dim) {
    int         row, col;
    real      **mat;

    mat = (real **) alloc2d(dim, dim, sizeof(real));
    if(mat == NULL)
        return (mat);

    for(row = 0; row < dim; row++)
        for(col = 0; col < dim; col++)
            mat[row][col] = (row == col ? 1.0 : 0.0); /* here */

    return (mat);
}

Я запутался, почему mat не разыменовывается для назначения значений строки / столбца. mat хранит адрес указателя, который, как я полагаю, преследует цель сохранить значение, измененное за пределами функции, так как же построить массив из адреса? Разве это не должно быть **mat[row][col] = (row == col ? 1.0 : 0.0);? Если нет, то почему это не работает?

1 Ответ

4 голосов
/ 30 мая 2019

Я смущен, почему mat не разыменовывается, чтобы назначить значения строки / столбца.

mat действительно разыменовывается со строкой:

mat[row][col] = (row == col ? 1.0 : 0.0); /* here */

В C синтаксис a[i] эквивалентен *((a) + (i)), поэтому у вас есть:

*(*((mat) + (row)) + (col)) = ...;

На самом деле, поскольку сложение коммутативно (даже для адресов), вы можете простолегко иметь row[mat][col].Например, соблюдайте синтаксис доступа к массиву, а также вывод для следующего кода:

int a[10][10];
int i = 0;

memset(a, 0, 10 * 10 * sizeof(int));

i[a][5] = 100;

printf("%d\n", 0[a][5]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...