你为什么要这样做:
void f(Struct** struct)
{
...
}
如果我希望对结构列表进行操作,是否仅仅传递Struct*
是不够的?这样我可以struct++
来解决下一个结构,或者我在这里很困惑? :)
如果我想以某种方式重新排列结构列表,它不会有用吗?但是,如果我只是在阅读,我不明白这一点。
答案 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
的数组,单个级别的间接肯定是足够的。