0

我从 Meyer's 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;

有人可以帮我吗?事实上,两个不同的约定似乎在做同样的事情,这让我感到困惑。

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 回答
0
rs = s2;

在这一行中 rs 是一个引用而不是一个指针。当 s2 被分配 rs 时,rs 仍然指向相同的内存,但该指针的值会发生变化。

ps = &s2;

这里 ps 是一个指针,这里 s2 的地址被分配给 ps,之前的 ps 指向不同的位置,该位置本身被移动以指向其他一些内存。

因此,指针和引用的行为发生了变化。

于 2013-06-04T09:25:48.257 回答