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

char *str = "Hello";

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

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

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

22
задан kiamlaluno 28 June 2010 в 21:05
поделиться

3 ответа

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

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

17
ответ дан 29 November 2019 в 05:06
поделиться

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

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

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

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

char** const rptr = &str;

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

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

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

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

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

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

12
ответ дан 29 November 2019 в 05:06
поделиться

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

#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 - это указатель char, указывающий на строковый литерал «Hello». rptr - это ссылка на указатель char, поэтому, когда вы меняете его (указатель, а не то, на что он указывает.), Вы меняете str1 . Таким образом, ptr указывает на «Привет». str1 указывает на «Мир!».

5
ответ дан 29 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: