目前我
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? (从最终用户的角度来看)
答案 0 :(得分:3)
不,C中没有 pass-by-reference 这样的东西,将指针传递给你想要在另一个函数中更新的类型是唯一的,推荐的启用方式改变原始变量。
我见过开发人员(自上次以来很长时间)使用以下内容只是为了让事情“更容易”,但说实话我认为这会让人头疼而不是美丽。
#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;
}
答案 1 :(得分:3)
与C ++不同,如果没有在调用函数中使用aNode
运算符,则无法传递&
的地址。
使用预处理器来隐藏你实际在做的事情,很可能被认为是比上述方式更“优雅”的方式。
答案 2 :(得分:2)
没有
如果您想要一个函数来修改x
,您需要将&x
传递给该函数,无论其类型如何。
你可以将它隐藏在宏后面,但这可能最终会让人感到更加困惑。
答案 3 :(得分: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
中使用)。
如果你的“指针”类型打算用作opaque类型,这是非常值得的;你当然不希望用户必须双重间接void_ptr_ref p
或必须投射它等。