имя строки как указатель на ее первый символ

#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:

  1. name это не указатель, это объект типа std::string . amp;name выдает вам адрес этого объекта.
  2. Чтобы получить (const-) указатель на первый символ строки, используйте name.c_str() .
  3. У указателей тоже есть адреса!

     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();