Я изучаю C и C++ и немного знаком с указателями. Мой главный вопрос: Хранит ли const char* адрес памяти? Этот вопрос возник при работе со строками. Как можно присвоить строку тому, что должно хранить адрес памяти?

#include 

int main(void) {
    const char* x = "Hello";
    std::cout << x << std::endl; // Returns Hello
    std::cout << &x << std::endl; // Returns the actual address
}

Как мне известно, приведенный выше код должен выводить адрес памяти, так что же на самом деле представляет собой char*?

Aayaan Sahu

Ответов: 2

Ответы (2)

char* действительно хранит адрес. Когда вы присваиваете константную строку, C++ помещает ее в удобное место (вероятно, в раздел .DATA исполняемого файла) и хранит указатель на нее в переменной x. В частности, это одна из причин, по которой константная символьная строка является, ну, const. Строка текста, на которую указывает const char*, может быть использована в других местах кода.

Обратите внимание, что cout имеет особое поведение при печати символьных массивов. Когда вы делаете &x, вы фактически получаете адрес локальной переменной, т.е. вещь типа const char**. Если вам нужен фактический адрес строки, вы можете использовать (void*)x, чтобы подавить обычное поведение печати строки.

const char* действительно содержит адрес памяти, а не строку. Чтобы это сработало, компилятор должен совершить некоторую "магию": он помещает содержание строкового литерала по некоторому адресу в памяти, а затем устанавливает этот адрес в указатель const char*. Таким образом, указатель хранит в памяти адрес начального символа вашей строки.

Одним из последствий этого является то, что вы не можете получить длину строки непосредственно из указателя const char*: вам нужно пройти через функцию, чтобы получить длину.

2022 WebDevInsider