c - 在不取消引用的情况下将索引与指针一起使用

标签 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); 吗?如果不是,为什么这不起作用?

最佳答案

I am confused why mat is not being dereferenced to assign the row/column values.

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]);

关于c - 在不取消引用的情况下将索引与指针一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56381393/

相关文章:

javascript - 删除节点元素而不删除innerHTML

c++ - 如何在 C++ 中发送二维数组作为引用,然后返回?

javascript - 未选取 D3 数组对象格式

c - 在 C 中分配动态内存的问题

c - 使用指针和两个结构数组进行桶排序

c - pthread 条件和进程终止

java - byte[] 到 String 再到 byte[]

python - 在 cython 类中包装一个预初始化的指针

c - 错误 : dereferencing pointer to incomplete type (Codeblocks, 在 C 中编程)

android - 如果我尝试使用 arm 数学汇编程序命令而不是 c,我会获得性能奖励吗