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 に答える