C 多维数组和指向具有一个Typedef的数组的指针

C 多维数组和指向具有一个Typedef的数组的指针,c,arrays,pointers,typedef,C,Arrays,Pointers,Typedef,这段代码有效,允许我通过指针数组访问2D数组: 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}

这段代码有效,允许我通过指针数组访问2D数组:

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处理此问题?

这里有一种方法:

typedef uint8_t ROW_TYPE[8];

ROW_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}};
ROW_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}};

ROW_TYPE *test_ptr_array[] = {test1, test2};
使用此方法,您可以访问诸如
test\u ptr\u array[0][1][2]
之类的数字,这将提供
test1[1][2]

以下是一种方法:

typedef uint8_t ROW_TYPE[8];

ROW_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}};
ROW_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}};

ROW_TYPE *test_ptr_array[] = {test1, test2};

使用此方法,您可以访问像
test\u ptr\u array[0][1][2]
这样的数字,这将提供
test1[1][2]

如果您愿意忍受额外的
*
,您可以使用
图像类型*ptr
来声明指针。但是,在将
图像类型
分配给
ptr
时,您需要使用
&
,并且要取消引用,您需要额外的
*
,如
(*ptr)[i][j]
。请注意,如果这样做更好,但它确实解决了具体的投诉。不要使用
typedef
指针。它会混淆代码,最终导致混乱。在函数和其他地方使用数组语法有什么问题?它在大多数情况下都会衰减为指针。
IMAGE_TYPE*test_ptr_array[]={&test1,&test2;}
应该可以工作。@immibis-确实可以!谢谢当我需要他们的地址时,我习惯于不使用数组,但我没有尝试过。immibis和Tom的建议要求在通过
test\u ptr\u array
使用数组时需要额外的尊重。如果你愿意忍受额外的
*
,你可以使用
IMAGE\u TYPE*ptr
来声明指针。但是,在将
图像类型
分配给
ptr
时,您需要使用
&
,并且要取消引用,您需要额外的
*
,如
(*ptr)[i][j]
。请注意,如果这样做更好,但它确实解决了具体的投诉。不要使用
typedef
指针。它会混淆代码,最终导致混乱。在函数和其他地方使用数组语法有什么问题?它在大多数情况下都会衰减为指针。
IMAGE_TYPE*test_ptr_array[]={&test1,&test2;}
应该可以工作。@immibis-确实可以!谢谢当我需要数组的地址时,我习惯于不使用数组&我没有尝试过。但是,immibis和Tom的建议要求在通过
test\u ptr\u array
使用数组时需要额外的尊重。