【问题标题】:Array Partition with pointer带指针的数组分区
【发布时间】:2013-08-19 13:56:40
【问题描述】:

我有一个 20 x 20 数组,需要通过读取 4 x 4 数组来迭代它。我以为我可以通过明确的分配来做到这一点,但除了强制关闭它并没有多大作用

const char SOURCE[20][20];
const char **pointer;

for(int x = 0; x < 20; x+=4)
{
    for(int y = 0; y < 20; y+=4)
    {
        pointer = (const char **)&SOURCE[x][y];
        printGrid(pointer);
    }
}

void printGrid(const char **grid)
{
    // do something usefull
}

【问题讨论】:

    标签: c++ pointers multidimensional-array


    【解决方案1】:

    只是将指针转换为不同的类型不会改变 它指向的类型(通常会导致未定义 行为,除非你真的知道你在做什么)。如果你 无法更改printGrid,您必须创建一个数组 即时指针:

    for ( int x = 0; x < 20; x += 4 ) {
        for ( int y = 0; y < 20; y += 4 ) {
            char const* p4[4] =
            {
                source[x] + y,
                source[x + 1] + y,
                source[x + 2] + y,
                source[x + 3] + y
            };
            printGrid( p4 );
        }
    }
    

    【讨论】:

    • 它会确保 p4 的元素是指向 4 个整数数组的指针吗?我认为它只是指向常量字符的 4 个指针的数组。不应该是char const (*p4[4])[4]吗??
    • @Saksham 一般来说,“指向数组的指针”是指向数组第一个元素的指针;这就是将数组转换为指针时得到的结果。由指针的用户决定它是指向单个对象的指针,还是指向数组的第一个元素的指针,以及数组中有多少元素。 char const (*p4[4))[4] 将是一个指向数组的指针数组;如果没有显式强制转换,我无法对其进行初始化,因为我没有任何char const[4] 可以使用其地址对其进行初始化。而且它没有正确的类型传递给printGrid
    【解决方案2】:

    指向指针的指针与数组数组相同。

    但是,您可以使用指向数组的指针:

    const char (*pointer)[20];
    

    你当然需要更新printGrid函数来匹配类型。


    至于 why 指针指向指针和数组数组(通常也称为矩阵)的原因,请参见例如this old answer of mine 显示两者的内存布局。

    【讨论】:

      【解决方案3】:

      您的二维数组的类型为char

      const char SOURCE[20][20];
      

      当您遍历它时,您可以查看char 或使用char* 引用地址:

      for(int x = 0; x < 20; x+=4)
      {
          for(int y = 0; y < 20; y+=4)
          {
              printGrid(SOURCE[x][y]); // do this unless you need to do something with pointer
          }
      }
      

      那么您可以使用以下任一签名来制作printGrid

      void printGrid(const char& grid)
      {
          // do something usefull
      }
      

      void printGrid(const char* grid)
      {
          // do something usefull
      }
      

      【讨论】:

        【解决方案4】:

        扩展 James 的答案,您可以如下更改代码,因为它看到它将指针传递给 4 个 char 的数组,而不仅仅是 char 的数组。

        for(int x = 0; x < 20; x+=4)
        {
            for(int y = 0; y < 20; y+=4)
            {
                char const (*p4[4])[4] =
                {
                    (const char(*)[4])(SOURCE[x] + y),
                    (const char(*)[4])(SOURCE[x + 1] + y),
                    (const char(*)[4])(SOURCE[x + 2] + y),
                    (const char(*)[4])(SOURCE[x + 3] + y)
                };
            }
        }
        

        【讨论】:

        • 那还是不行。根据他的说法,printGrid 需要一个指向 4 个char const* 的数组的指针,每个数组都指向 4 个char。你给它一个指向单个char const*的指针,它指向一个20 - ychar的数组。完全不是一回事。
        • @JamesKanze 虽然您的解决方案似乎是最好的,但对我的更新解决方案有什么建议吗??
        • 似乎有太多的间接性。 printGrid 需要一个指向指针数组[4] 的指针,因此在某些时候,您需要一个 char const *tmp[4];(我在您的代码中没有看到)。没有其他事情会做。然后将数组中第一个元素的地址传递给它(几乎可以肯定,这将通过隐式数组到指针的转换获得)。
        • @JamesKanze 现在应该没问题了
        • 他的函数printGrid 的类型仍然错误(因为p4 隐式转换为char const (**)[4],而不是char const**)。您需要显式转换这一事实应该表明某些事情是不正确的。
        猜你喜欢
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        相关资源
        最近更新 更多