繁体   English   中英

引用指针

[英]Reference to a pointer

char *str = "Hello";

char *ptr = str;
char *&rptr = str;

ptr和rptr有什么区别? 我理解rptr是一个指针的引用(理论上),但它与ptr的实现方式有何不同?

C ++中的引用是否使用指针实现?

ptr和rptr有什么区别?

如果你做char *world = "World"; rptr = world; char *world = "World"; rptr = world; 然后打印str ,它将打印“World”。 如果你做ptr = world; 然后打印str ,它将打印“Hello”。

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引用也具有能够延长临时生命周期的独特属性,但这可能超出了讨论的范围。

尝试这个:

#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”的char指针。 rptr是对char指针的引用,所以当你更改它时(指针,而不是它指向的东西。)你改变了str1 因此ptr指向“你好”。 str1指向“世界!”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM