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

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

20 голосов
/ 27 июня 2010
char *str = "Hello";

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

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

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

Ответы [ 3 ]

17 голосов
/ 27 июня 2010

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

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

12 голосов
/ 28 июня 2010

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

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

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

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

char** const rptr = &str;

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

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

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

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

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

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

5 голосов
/ 28 июня 2010

Попробуйте:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...