gpt4 book ai didi

c - 将一维数组作为二维数组访问

转载 作者:太空狗 更新时间:2023-10-29 16:56:14 25 4
gpt4 key购买 nike

我有一个一维数组 int *data 并且我知道有效存储在其中的 rowscols 的数量。也就是说,我可以使用 data[i*cols+j] 之类的东西访问二维矩阵 (i,j) 的元素。

具体来说,这些存储在一个结构中:

typedef struct {
int *data;
int rows;
int cols;
} matrix_t;

在过去的某个时候,我也写过这段巫毒代码:

#define MATRIXP(m) __typeof__(__typeof__(__typeof__(*((m).data))[(m).cols]) *)
#define MATRIXD(m) ((MATRIXP(m)) ((m).data))

有了这些定义,我能够做到:

MATRIXP(matrix) m = MATRIXD(matrix);

然后我可以使用矩阵 m 作为二维矩阵指针来访问 data

m[3][2] = 5; /* assign the element in row 3 and column 2 */

这非常好,意味着我不需要记住总是有一个像 data[i*cols+j] 这样的表达式。但是,这段代码是我很久以前写的,现在我不记得它是如何工作的了。

  1. 谁能准确解释一下所有这些 __typeof__ 运算符是如何工作的,以及如何读取相似的表达式?变量 m 的类型是什么?

    我知道它可以扩展为:

    __typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m = ((__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)) ((matrix).data));
  2. 这种访问数据的方法安全吗?这是最好的方法吗?

最佳答案

问题一:

MATRIXP(matrix) m(matrix 应该是 matrix_t 类型的变量)将扩展为

__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m

从内到外

  1. __typeof__(*((matrix).data))*((matrix).data)的类型,即int 根据 matrix_t 的定义。

  2. 所以 (__typeof__(*((matrix).data))[(matrix).cols]) 等于 (int [cols])

  3. 所以 __typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) 等于 (int [cols] *)

  4. 这是 MATRIXP(matrix) 给出的类型。

因此,MATRIXP(matrix) 等于 (int [(matrix).cols] *)。换句话说,

MATRIXP(matrix) m

有效

int (*m)[matrix.cols]

正如@codebeard 指出的那样

问题二:

我觉得很安全。

关于c - 将一维数组作为二维数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23381669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com