【发布时间】:2016-03-10 00:40:12
【问题描述】:
这段代码有效,允许我通过指针数组访问二维数组:
typedef uint8_t IMAGE_TYPE[4][8];
typedef uint8_t (*IMAGE_PTR_TYPE)[8];
IMAGE_TYPE test1 = {{0,1,2,3,4,5,6,7},
{0,1,2,3,4,5,6,7},
{0,1,2,3,4,5,6,7},
{0,1,2,3,4,5,6,7}};
IMAGE_TYPE test2 = {{10,11,12,13,14,15,16,17},
{10,11,12,13,14,15,16,17},
{10,11,12,13,14,15,16,17},
{10,11,12,13,14,15,16,17}};
IMAGE_PTR_TYPE test_ptr_array[] = {test1, test2};
然而,我有两个 typedef 真的让我很恼火。看来我应该只需要一个,并且这段代码应该可以工作:
IMAGE_TYPE *test_ptr_array[] = {test1, test2};
然而,它并没有给我这个错误:
错误:无法将 'uint8_t ()[8] {aka unsigned char ()[8]}' 转换为 'uint8_t ()[4][8] {aka unsigned char ()[4][8]}' 在初始化中
C 有没有一种方法可以让我只用一个 typedef 来处理这个问题?
【问题讨论】:
-
如果你愿意忍受额外的
*,你可以使用IMAGE_TYPE *ptr;来声明你的指针。但是在将IMAGE_TYPE分配给ptr时,您需要使用&,并且要取消引用,您需要额外的*,如(*ptr)[i][j]。请注意确定这是否更好,但它确实解决了具体的投诉。 -
不要
typedef指针。它混淆了您的代码并最终导致混乱。对函数和其他地方使用数组语法有什么问题?对于大多数用途,它无论如何都会衰减为指针。 -
IMAGE_TYPE *test_ptr_array[] = {&test1, &test2;}应该可以工作。 -
@immibis - 确实有效!谢谢!当我需要我没有尝试过的地址时,我习惯于在数组中不包含 &。
-
immibis 和 Tom 的建议在通过
test_ptr_array使用数组时需要额外的尊重。