2013-01-05 8 views
5

C関数で引数として:何不要として私を打つことは地元のポインタの宣言(あるポインタ私は、単純なgetListLength()関数はこのようになります読んだ多くの例で

int getListLength(struct node *head) 
{ 
    struct node *temp = head; 
    int iCount = 0; 

    while (temp) 
    { 
     ++iCount; 
     temp = temp->next; 
    } 

    return iCount; 
} 

を渡されたパラメータをコピーするこの場合は* temp)。私が正しくリコールすれば、渡されたパラメーターは自分のコピーを取得します。したがって、*ヘッドはコピーそのものなので、*ヘッドをコピーするローカルポインタは必要ありません。 つまり、* tempポインタを破棄して代わりに頭を使用するのは正しいでしょうか?

答えて

4

はい、コピーですので、正しいはずです。

int getListLength(struct node* head) 
{ 
    int iCount = 0; 

    while (head) 
    { 
     ++iCount; 
     head = head->next; 
    } 
    return iCount; 
} 

あなたはそれを実行して自分で見てみませんか?

4

ポインタが値渡しされているので、ローカルコピーが必要ないのは事実ですが、それはおそらくスタイル上の理由からです。一部の人は、渡された引数を変更するのは悪いフォームだと考えていますが(私はそれがいくつかのシナリオでは便利だと思いますが)、おそらくもっと重要なことに、コード内のいくつかの自己文書化を失います。具体的には、headは、もはやリンクされたリストの真の先頭を常に指していません。これは短いコードでは紛らわしいことではありませんが、コードが長くて複雑な場合は、不正確な名前の変数が混乱する可能性があります。

+0

"コードがより長く複雑な場合。" - 私はそれで議論することができます。関数が1つのOPより長い場合は、複数のタスクを実行し、変数名を記憶する必要があるほど複雑な場合は、その関数をリファクタリングする必要があります。 –

+0

それはおそらく本当ですが、現実の世界はまれに完璧なものではありません。 – jjlin

2

多くの場合、渡されたポインタのローカルコピーを作成する理由は、関数のside-effectsを減らすことです(関数のパラメータを変更しないことによって)。

関数は(書かないで)だけを読むためにポインタを使用してで、外の世界他の相互作用を持っていない場合は、関数はGCCに「純粋な」として注釈を付けることができ、オープンになりますいくつかの素晴らしい最適化のために。

例:

__attribute__((pure)) int getListLength(struct node *head) 
{ 
    struct node *temp = head; 
    int iCount = 0; 

    while (temp) 
    { 
     ++iCount; 
     temp = temp->next; 
    } 

    return iCount; 
} 

あなたは副作用が何であるかを熟知していない場合は、対象の詳細な情報を得るためにSide EffectsFunctional Programming Wikipediaの記事を読んでみてください。

関連する問題