Ответ 1
В чем разница между ptr и rptr?
Если вы выполните char *world = "World"; rptr = world;
, а затем распечатайте str
, он напечатает "Мир". Если вы выполняете ptr = world;
, а затем печатаете str
, он будет печатать "Hello".
char *str = "Hello";
char *ptr = str;
char *&rptr = str;
В чем разница между ptr и rptr? Я понимаю, что rptr является ссылкой на указатель (теоретически), но как он отличается с точки зрения реализации с помощью ptr?
Используются ли ссылки в С++ с помощью указателей?
В чем разница между ptr и rptr?
Если вы выполните char *world = "World"; rptr = world;
, а затем распечатайте str
, он напечатает "Мир". Если вы выполняете ptr = world;
, а затем печатаете str
, он будет печатать "Hello".
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 также имеют уникальное свойство быть способным продлить время жизни временных рядов, но это, вероятно, выходит за рамки обсуждения.
Попробуйте следующее:
#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
указывает на "Мир!".