【问题标题】:Passing an array to a function which accepts double pointer in arg-list将数组传递给在 arg-list 中接受双指针的函数
【发布时间】:2016-05-25 15:05:53
【问题描述】:

我想将新定义的数组bool myArr[] = { false, false, true }; 传递到现有函数下面。

void fun(bool** pArr, int idx)
{
    if(NULL == *pArr)
       return;

    (*pArr)[idx] = false;

    ...
    ...

    return;
}

我不允许更改子程序fun 中的任何内容,我想使用标识符myArr 调用该函数。当我尝试fun(&myArr, 2); 时,出现以下编译错误。

没有匹配函数调用fun(bool (*)[3], int)

候选者是:void fun(bool**, int)

我能想到的一种方法如下

bool* ptr = myArr;
fun(&ptr, 2);

但这对我来说看起来很脏,请建议一种使用 myArr 调用 fun my 的方法

【问题讨论】:

  • 看起来很脏,基本上是怎么弄的。
  • if(NULL == *pArr) 不舒服就是说反了。
  • hacky 方式可以是fun((bool **)&myArr, 2);
  • 如果函数决定分配*pArr会发生什么??这种设计有些可疑。您的“肮脏”方式是唯一正确的方式...
  • @FrankPuffer 如果你的环境中的人在使用它,一旦你习惯它就会变得很自然。

标签: c++ arrays pointer-to-pointer


【解决方案1】:

需要指向指针的函数通常需要 jagged array 您可以使用单个元素 myArray 构造一个数组数组,并将该数组传递给您的函数,如下所示:

bool *arrayOfPtrs[] = { myArray };
fun(arrayOfPtrs, 2);

这比您的指针解决方案读起来略好,因为创建指针数组消除了为什么要创建指向指针的指针的问题 (demo)。

【讨论】:

  • 链接到术语 jagged array 会很好。如果我必须绑定单个参数或单个结果,我怀疑它会与 libmysqlclient 一起使用。
  • 我认为这里更有可能使用双指针作为能够更改指针参数的 C 方法(最好使用 C++ 中的引用来完成)。但是你的解决方案应该可以工作。
【解决方案2】:

此函数需要一个指向bool* 的指针,因此调用它的唯一方法是在某处拥有一个实际的bool* 对象。您的解决方案是唯一的。

【讨论】:

    【解决方案3】:

    如果您想避免每次调用函数时都使用 hack,您可以简单地编写一个包装函数:

    void fun(bool** pArr, int idx)
    {
        if(NULL == *pArr)
           return;
    
        (*pArr)[idx] = false;
    }
    
    void super_fun(bool* pArr, int idx)
    {
        fun(&pArr, idx);
    }
    
    int main()
    {
        bool myArr[] = { false, false, true };
    
        super_fun(myArr, 2);
    }
    

    【讨论】:

      【解决方案4】:

      我会做一些不同的事情。我觉得这有点干净:

      void fun2(bool * pArr, int idx)
      {
          *(pArr + idx) = true;
      
          return;
      }
      
      
      int main(int argc, _TCHAR* argv[])
      {
          bool myArr[] = { false, false, true };
      
          fun2(myArr, 1);
      
          return 0;
      }
      

      现在我在我的 c++14 中使用它,它不允许我使用索引器直接访问元素。也许这在某个时候改变了?但我认为这是合理的。

      编辑,这真的更好:

      void fun3(bool pArr[], int idx)
      {
          if (NULL == *pArr)
              return;
      
          pArr[idx] = false;
      
          return;
      }
      

      【讨论】:

      • 你能把 _tmain 改成 main 来遵循标准吗?
      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2013-02-15
      相关资源
      最近更新 更多