【问题标题】:Multi-dimensional arrays and Pointers to those Arrays with one Typedef具有一个 Typedef 的多维数组和指向这些数组的指针
【发布时间】: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 使用数组时需要额外的尊重。

标签: c arrays pointers typedef


【解决方案1】:

这是一种方法:

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_ptr_array[0][1][2] 这样的数字,它给出test1[1][2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多