C++の質問です


char * Ptr = NULL;

abc( (char *&)Ptr )

と記載した場合、abcに渡されるのは、
  Ptr の内容 NULLでしょうか?
  Ptr と言うエリアのアドレスでしょうか?

abc( (char *)Ptr )
abc( (char **)&Ptr )
ならば判るのですが・・・・・

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/04/22 14:50:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:qwerty No.1

回答回数13ベストアンサー獲得回数2

ポイント60pt

強いていえば、「Ptr と言うエリアのアドレス」の方が正解です。

C++流の言い方をすれば、「charポインタへの参照」が渡ります。

「abc( (char **)&Ptr )」と動作は似ています。以下のサンプルコードを追いかけてみると、仕組みがわかると思います。



char *hoge = "abcdefg";

void abc(char *&p)

{

p = hoge;

}

int main(int argc, char **argv)

{

char * Ptr = NULL;

abc( (char *&)Ptr );

puts(Ptr);

return 0;

}


http://q.hatena.ne.jp/1271310501

id:gin106

有り難う御座います、理解出来ました

しかし

この使い分けの思想は、何でしょうか?

2010/04/15 16:35:59
  • id:taknt
    そもそも abcって 何かな?

    (char *&)Ptrは アドレスを 示しますね。
  • id:gin106
    abcは、別段意味はありません。
    関数への引数として表したかったからだけです!

    Ptrと言うエリアのアドレスを示しているのですか?
    と言う事は、関数abc()の中で、Ptrの内容を変更可能と言う事ですか?

    (char **)&Ptr と同一の意味?
  • id:qwerty
    > と言う事は、関数abc()の中で、Ptrの内容を変更可能と言う事ですか?


    Ptrの内容を変更可能です。

    char ** の場合は、

    void abc(char **p)
    {
    *p = hoge;
    }

    のようにして、呼び出し元の変数に代入できますが、
    char *& の場合は、

    void abc(char *&p)
    {
    p = hoge;
    }

    で、同じような事が可能です。
    個人的には、プログラムが読みにくくなりますので、あまり推奨できません。


  • id:gin106
    なるほど! 有り難う御座います!!!
  • id:qwerty
    > しかし
    > この使い分けの思想は、何でしょうか?

    私個人的な流儀ですが、参照を示す & は const とセットにして使います。
    たとえば、

    class ABC {
    // 大きなクラス
    };

    void abc(ABC const &x)
    {
    x.member();
    }

    このような使い方をすると、呼び出し元のオブジェクトの複製を作らずに、ポインタを渡す事になります。
    「*」との決定的な違いは、ポインタ渡しならx->member()のようにしてメンバにアクセスしますが、
    参照渡しなら、x.member()の様に書けるという点です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません