指针的两种不同语法约定
Two different syntax conventions for 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;
有人能帮我吗?事实上,两种不同的约定似乎在做同样的事情,这让我很困惑
string*ps=&s1;
在我看来,这最好写成string* ps = &s1;
,但它们对编译器来说意义相同。您正在创建一个类型为"string*"(指向字符串的指针(的新变量"ps",并为其分配一个等于s1
变量地址的初始值。绝对没有取消引用。。。该用法中的*
指示指针类型而不是解引用操作。
ps = &s2;
然后为ps
指针分配一个新值,即s2
字符串对象的地址。
string *ps = &s1;
将ps
设置为s1
的地址
ps = &s2;
将CCD_ 9设置为CCD_。
引用只能在定义变量的同一行上设置。之后的任何操作都会将右侧的值复制到左侧的引用值中。
指针可以随意设置,访问指针的内容时,需要使用*ps = ...
或ps[x]
(在这种情况下,除了x
的0之外的任何值都是未定义的(
rs = s2;
在这一行中,rs是一个引用而不是指针。当s2被赋值为rs时,rs仍然指向相同的内存,但该指针处的值发生了变化。
ps = &s2;
这里ps是一个指针,这里s2的地址被分配给ps,之前的ps指向不同的位置,该位置本身被移动到其他内存。
因此指针和引用的行为发生了变化。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 为什么在 x64 中忽略__stdcall调用约定?
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 指针的两种不同语法约定