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

时间:2014-04-30 07:01:47

标签: c arrays matrix multidimensional-array typeof

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

具体来说,它们存储在struct:

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. 这种访问data的方法是否安全?这是最好的方法吗?

1 个答案:

答案 0 :(得分:5)

问题1:

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

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

从一侧到另一侧

  1. __typeof__(*((matrix).data))是[{1}}的类型,根据*((matrix).data)的定义为int

  2. 因此matrix_t等于(__typeof__(*((matrix).data))[(matrix).cols])

  3. 因此(int [cols])等于__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)

  4. 这是(int [cols] *)给出的类型。

  5. 因此,MATRIXP(matrix)等于MATRIXP(matrix)。换句话说,

    (int [(matrix).cols] *)

    实际上是

    MATRIXP(matrix) m
    

    正如@codebeard所指出的

    问题2:

    对我来说看起来很安全。