指针有两种不同的语法约定?

时间:2013-06-04 08:31:36

标签: c++ pointers

我从Meyer的更有效的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;
有人可以帮助我吗?事实上,两种不同的惯例似乎在做同样的事情,这让我感到困惑。

3 个答案:

答案 0 :(得分:6)

  

string * ps =& s1;

在我看来,这更好地写成string* ps = &s1;,但它们对编译器来说意味着同样的事情。您正在创建一个类型为“string *”的新变量“ps”(指向字符串的指针),并为其指定一个等于s1变量地址的初始值。绝对没有解除引用...这个用法中的*表示指针类型,而不是解除引用操作。

ps = &s2;然后为ps指针指定一个新值,即s2字符串对象的地址。

答案 1 :(得分:1)

string *ps = &s1;

ps设置为s1

的地址
ps = &s2;

ps设置为s2的地址。

只能在定义变量的同一行上设置引用。之后的任何内容都会将正确的值复制到左侧的引用值中。

可以根据需要随意设置指针,并且访问指针的内容,您需要使用*ps = ...ps[x](在这种情况下,x以外的任何内容{ {1}}将是未定义的)

答案 2 :(得分:0)

rs = s2;

在这一行中,rs是引用而不是指针。当s2被赋值为rs时,rs仍指向相同的内存,但该指针的值会改变。

ps = &s2;

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

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