#c
#c
Вопрос:
Дано
string name="avinash";
cout<<amp;name;
Если name
это указатель на a, то как мы используем адрес для указателя?
Ответ №1:
name
это не указатель, это std::string
само по себе. Так amp;name
называется адрес этой строки, что означает, что этот код выведет число.
Даже если бы это был указатель, использование operator amp;
для него было бы совершенно законным: оно вернуло бы адрес переменной указателя в памяти (другой, отличающийся от числа).
Если вам нужен указатель на первый символ внутри name
, то используйте name.c_str()
для получения строки в стиле C, заканчивающейся нулем (которая на самом деле является указателем на первый символ строки), или name.data()
которая возвращает указатель на строку, но не гарантирует, что она будет заканчиваться нулем.
Комментарии:
1. Также: попытка изменить строку в стиле C приведет к неопределенному поведению (C 03 21.3.6 /2 и 17.4.3.8)
Ответ №2:
name
не является указателем, name — это std::string
объект. amp;name
, который является указателем, является адресом этого объекта.
Ответ №3:
name
это не указатель, это объект типаstd::string
.amp;name
выдает вам адрес этого объекта.- Чтобы получить (const-) указатель на первый символ строки, используйте
name.c_str()
. -
У указателей тоже есть адреса!
int i = 5; int *j = amp;i; int **k = amp;j;
Это полезно, если вы хотите передать указатель на функцию, которая должна манипулировать этим указателем (например, путем выделения памяти):
void allocate_string(std::string **foo) { *foo = new std::string(); }
Ответ №4:
В классе Hi string есть метод c_str(). Использовать const char* ptr = name.c_str();