0

目前我有

void clistDeleteNode(clist_t *list,cnode_t **pnode) {
    cnode_t *node=*pnode;

    /* stuff done with node here, removed for clarity */

    free(*pnode);
    *pnode=0;
}

这被称为

clistDeleteNode(list,&aNode);

该函数在释放后自动将最终用户指针设为 NULL - 我这样做是因为它使调试和泄漏检查更容易。

有没有更优雅的方法来传递一个指向函数的指针,比如它可以被修改而不必使用 * & *aNode ?(从最终用户的角度来看)

4

4 回答 4

3

不,C 中没有传递引用之类的东西,传递一个指向您想在另一个函数中更新的类型的指针是启用更改原始变量的唯一且推荐的方法。


不推荐..真的,请不要使用它。

我见过开发人员(自上次以来很长时间)使用以下内容只是为了让事情“更容易”,但老实说,我认为它比美观更让人头疼。

#define REF(v) (&v)
#define REF_TO(type, v) type *v
#define DEREF(p) (*p)

void
func (REF_TO(int*, p))
{
  DEREF(p) = 0;
}

int
main (int argc, char* argv[])
{
  int *p;

  func (REF(p));

  return 0;
}

不要 - 不要 - 使用 - 它,认真的。

于 2012-07-15T23:25:15.677 回答
3

与 C++ 不同,没有在调用函数中aNode不使用运算符的情况下传递地址的方法。&

使用预处理器隐藏你实际在做的事情很可能被认为是一种比上述清晰方式更“优雅”的方式。

于 2012-07-15T23:26:42.030 回答
2

不。

如果你想修改一个函数x,你需要传递&x给函数,不管是什么类型。

您可以将其隐藏在宏后面,但这最终可能会更加令人困惑。

于 2012-07-15T23:24:36.410 回答
0

是的,但它很丑;您可以使用数组类型和数组指针衰减来模拟参考参数。

typedef void (*void_ptr_ref)[1];
void func(void_ptr_ref p) {
    p[0] = 0;
}
int main() {
    void_ptr_ref p;
    func(p);
    /* do stuff with p */
}

Posix 实际上使用这种(可怕的!)样式作为jmp_buf类型(用于setjmp.h)。

仅当您的“指针”类型打算用作不透明类型时,这才是真正值得的;您当然不希望用户必须双重间接void_ptr_ref p或必须投射它等。

于 2012-07-15T23:38:55.380 回答