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 также обладают уникальным свойством продления срока службы временных файлов, но это, вероятно, выходит за рамки обсуждения.