0

Meyer の More Effective C++ から次の情報を入手しました。

string s1("Nancy");
string s2("Clancy");

string& rs = s1;     // rs refers to s1
string *ps = &s1;    // ps points to s1

rs = s2;             // rs still refers to s1, but s1’s value is now "Clancy"
ps = &s2;            // ps now points to s2; s1 is unchanged

ある行が s1 のアドレスに割り当てられたポインターを逆参照して、s1 を「ポイントする」理由がわかりません。

string *ps = &s1;

さらに別の行は、ポインターを「指す」s2 に逆参照しません。

ps = &s2;

誰かがここで私を助けることができますか? 2 つの異なる規則が同じことをしているように見えるという事実が、私を混乱させています。

4

3 に答える 3

6

文字列 *ps = &s1;

私の意見では、これは のように記述した方が適切ですがstring* ps = &s1;、コンパイラにとっては同じことを意味します。タイプ「string*」(文字列へのポインター)の新しい変数「ps」を作成し、変数のアドレスに等しい初期値を割り当てていs1ます。逆参照はまったく行われていません...*この使用法では、逆参照操作ではなく、ポインター型を示します。

ps = &s2;次に、ポインターに新しい値、つまり文字列オブジェクトpsのアドレスを割り当てます。s2

于 2013-06-04T08:36:17.853 に答える
1
string *ps = &s1;

psのアドレスに設定しますs1

ps = &s2;

psのアドレスに設定しますs2

参照は、変数が定義されているのと同じ行にのみ設定できます。それ以降は、右側の値を左側の参照値にコピーします。

ポインターは好きなだけ何度でも設定でき、ポインターの内容にアクセスするには*ps = ...orを使用する必要がありますps[x](この場合、0 以外はx未定義になります)

于 2013-06-04T08:38:19.607 に答える