在不解引用的情况下使用带有指针的索引

时间:2019-05-30 15:39:49

标签: c arrays pointers

我正在寻找一个构成单位矩阵的函数,但是我对正在使用的某些语法感到困惑。

/* 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 个答案:

答案 0 :(得分:4)

  

我很困惑为什么未取消引用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]);