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

cod*_*ard 9 c arrays typeof matrix multidimensional-array

我有一个一维数组int *data,我知道它的数量rowscols有效存储.也就是说,我可以(i,j)通过使用类似的东西来访问二维矩阵的元素data[i*cols+j].

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

typedef struct {
    int *data;
    int rows;
    int cols;
} matrix_t;
Run Code Online (Sandbox Code Playgroud)

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

#define MATRIXP(m) __typeof__(__typeof__(__typeof__(*((m).data))[(m).cols]) *)
#define MATRIXD(m) ((MATRIXP(m)) ((m).data))
Run Code Online (Sandbox Code Playgroud)

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

MATRIXP(matrix) m = MATRIXD(matrix);
Run Code Online (Sandbox Code Playgroud)

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

m[3][2] = 5; /* assign the element in row 3 and column 2 */
Run Code Online (Sandbox Code Playgroud)

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

  1. 有人可以准确解释所有这些__typeof__运营商是如何工作的,以及如何阅读类似的表达方式?变量的类型是m什么?

    我知道它扩展到类似的东西:

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

Lee*_*hem 5

问题1:

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

__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m
Run Code Online (Sandbox Code Playgroud)

从侧面到外侧

  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
Run Code Online (Sandbox Code Playgroud)

是有效的

int (*m)[matrix.cols]
Run Code Online (Sandbox Code Playgroud)

正如@codebeard所指出的那样

问题2:

对我来说看起来很安全.