cod*_*ard 9 c arrays typeof matrix multidimensional-array
我有一个一维数组int *data
,我知道它的数量rows
和cols
有效存储.也就是说,我可以(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]
.但是,我不久前写了这段代码,现在我不记得它是如何工作的.
有人可以准确解释所有这些__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)这种访问方法data
安全吗?这是最好的方法吗?
问题1:
MATRIXP(matrix) m
(matrix
应该是类型的变量matrix_t
)将扩展为
__typeof__(__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *) m
Run Code Online (Sandbox Code Playgroud)
从侧面到外侧
__typeof__(*((matrix).data))
是的类型*((matrix).data)
,int
根据定义matrix_t
.
所以(__typeof__(*((matrix).data))[(matrix).cols])
等于(int [cols])
所以__typeof__(__typeof__(*((matrix).data))[(matrix).cols]) *)
等于(int [cols] *)
这就是给出的类型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:
对我来说看起来很安全.
归档时间: |
|
查看次数: |
1051 次 |
最近记录: |