Подтвердить что ты не робот

Ссылка на указатель

char *str = "Hello";

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

В чем разница между ptr и rptr? Я понимаю, что rptr является ссылкой на указатель (теоретически), но как он отличается с точки зрения реализации с помощью ptr?

Используются ли ссылки в С++ с помощью указателей?

4b9b3361

Ответ 1

В чем разница между ptr и rptr?

Если вы выполните char *world = "World"; rptr = world;, а затем распечатайте str, он напечатает "Мир". Если вы выполняете ptr = world;, а затем печатаете str, он будет печатать "Hello".

Ответ 2

str хранит адрес (и, следовательно, указывает) на литеральную строку "Hello", которая хранится где-то в сегменте памяти, доступном только для чтения.

ptr указывает на тот же адрес, что и 'str'.

rptr в основном указывает на 'str' (не на тот же объект, что и на str, а на str). Необязательно использовать "точки для" для ссылок, но они действительно очень похожи на самих указателей (в данном случае на указатель на указатель), за исключением небольших синтаксических различий и ограничений, которые они не могут указывать на какой-либо другой адрес во время их срок службы.

Это было бы аналогично:

char** const rptr = &str;

Как и ссылка, rptr выше не может быть назначен новый адрес (он не может изменить то, на что указывает), но он может быть свободен в изменении своего pointee (который в данном случае является указателем на 'str').

*rptr = 0; // after this, str == 0

Ссылки почти такие же, как указатель только для чтения (а не изменяемый указатель на точку доступа только для чтения), только они не требуют, чтобы оператор разыменования получал у получателя (ссылочные данные):

char *str = "Hello";
char *&rptr = str;
rptr = 0; // after this, str == 0

Единственное отличие от вышеприведенного примера с указателем на указатель на указатель заключается в том, что нам не нужно было использовать оператор *.

Ссылки

const также имеют уникальное свойство быть способным продлить время жизни временных рядов, но это, вероятно, выходит за рамки обсуждения.

Ответ 3

Попробуйте следующее:

#include <iostream>
int main () {
    char *str1 = "Hello ";
    char *str2 = "World!";
    char *ptr = str1;
    char *&rptr = str1;
    rptr = str2;
    std::cout << ptr << str1 << std::endl;
}

Он печатает "Привет, мир!". потому что ptr - это указатель char, указывающий на строковый литерал "Hello". rptr - ссылка на указатель char, поэтому, когда вы меняете его (указатель, а не то, на что он указывает). вы меняете str1. И, таким образом, ptr указывает на "Hello". str1 указывает на "Мир!".