char *str = "Hello";
char *ptr = str;
char *&rptr = str;
ptr和rptr有什么区别?我理解rptr是一个指针的引用(理论上),但它与ptr的实现方式有何不同?
C ++中的引用是否使用指针实现?
答案 0 :(得分:16)
ptr和rptr有什么区别?
如果您执行char *world = "World"; rptr = world;
然后打印str
,则会打印“世界”。如果您执行ptr = world;
然后打印str
,则会打印“Hello”。
答案 1 :(得分:12)
str 将地址(因此指向)存储到文字字符串“Hello”,该字符串存储在只读内存段中的某处。
ptr 指向与'str'相同的地址。
rptr 基本上指向'str'(不是与str相同的指针,而是指str本身)。使用'points to'作为引用可能是不寻常的,但它们实际上非常像指针本身(在这种情况下是一个指向指针的指针),除了有轻微的语法差异以及它们在它们期间不能指向任何其他地址的限制寿命。
这类似于:
char** const rptr = &str;
像引用一样,上面的rptr不能被分配一个新地址(它不能改变它所指向的地址),但它可以自由地改变它的指针(在这种情况下恰好是指针'str')。
*rptr = 0; // after this, str == 0
引用与只读指针(不是指向只读指针的可变指针)几乎相同,只是它们不需要解引用操作符来获取指针(引用的数据):
char *str = "Hello";
char *&rptr = str;
rptr = 0; // after this, str == 0
上述示例与指针的只读指针的唯一区别在于我们不必使用运算符*。
const引用也具有能够延长临时生命周期的独特属性,但这可能超出了讨论的范围。
答案 2 :(得分:5)
试试这个:
#include <iostream>
int main () {
char *str1 = "Hello ";
char *str2 = "World!";
char *ptr = str1;
char *&rptr = str1;
rptr = str2;
std::cout << ptr << str1 << std::endl;
}
打印“Hello world!”因为ptr
是一个指向字符串文字“Hello”的字符指针。 rptr
是对char指针的引用,因此当你更改它时(指针,而不是指向它的东西。)你改变str1
。因此ptr
指向“你好”。 str1
指向“世界!”。