为什么将指针作为参数传递给函数

时间:2012-11-09 11:31:18

标签: c

你为什么要这样做:

void f(Struct** struct)
{
   ...
}

如果我希望对结构列表进行操作,是否仅仅传递Struct*是不够的?这样我可以struct++来解决下一个结构,或者我在这里很困惑? :)

如果我想以某种方式重新排列结构列表,它不会有用吗?但是,如果我只是在阅读,我不明白这一点。

5 个答案:

答案 0 :(得分:2)

这取决于您的数据结构是什么样的。假设p是一个以空终止的struct s指针数组,你可以使用这样的循环来运行它:

void f(struct s **p)
{
    while (*p != NULL) {
        /* some stuff */
        (*p)++;
    }
}

通常,只有在尝试修改指针本身时,才使用指向指针的指针。

答案 1 :(得分:1)

如果你想修改传递给这个函数的调用者中的指针,你通常会这样做。

因为,所有内容都是通过C中的值传递的,所以传递struct*只会传递指针的副本,并且不会修改调用者中的指针。为什么传递struct * C-FAQ

中有解释

如果您不打算在调用者中修改指针,则无需传递struct **

答案 2 :(得分:1)

这种参数有很多用途......

已经提到过,并且很常见的是允许调用者使用该函数来修改指针。这里显而易见的情况是获取一些数据......

void getData( void** pData, int* size )
{
    *pData = getMyDataPointer();
    *size = getMyDataSize();
}

另一种选择是,可能额外的间接级别允许列表以某种方式运行?例如通过使用索引来引用特定元素,可以分配和重新分配它们,而不会有悬挂指针的风险。

另一种选择是列表非常大并且存在于碎片存储器中,或者被快速访问,因此列表实际上是几个组合在一起的较小列表。这种技术也可用于'懒惰'分配大型数组,例如提供一个十亿个元素数组的接口,然后根据需要分配100k的块,因为它们是用struct **指向整个事物读取/写入的,并且每个struct *都是null或指向100k结构...

老实说,上下文非常重要......作为函数参数的三重指针也有很多用途,它们遵循类似的推理。 (例如,我提到的第一件事与第二件,或第二件与第三件等相结合。)

答案 3 :(得分:0)

如果每个函数的第一个参数相同,API的创建者可能认为参数列表更容易记忆。

答案 4 :(得分:0)

你是对的,没有理由将指针传递给指针,除非你的函数是为了修改传入的指针。如果访问struct的数组,单个级别的间接肯定是足够的。