将数组传递给接受arg-list中的双指针的函数

时间:2016-05-25 15:05:54

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

我想将新定义的数组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);

但它看起来很脏,请建议使用fun

调用myArr我的方法

4 个答案:

答案 0 :(得分:4)

想要指向指针的函数通常需要 jagged array您可以构造一个包含单个元素myArray的数组数组,并将该数组传递给您功能,像这样:

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

这比读指针解决方案稍微好一点,因为创建一个指针数组消除了为什么要创建指向指针的问题(demo)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我会做一点不同的事情。我认为这有点清洁:

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

答案 3 :(得分:0)

如果你想在每次调用函数时都避免使用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);
}