ОК, я знаю, что этот вопрос старый, но мне кажется, что очевидный ответ здесь на самом деле:
std::string your_string{"Hello"};
//Take the address of the beginning
auto start_address = &(*your_string.begin())
//Take the address at the end
auto end_address = &(*your_string.end())
По сути, это будет выполнять то же самое, что и использование:
auto start_address = your_string.c_str();
auto end_address = your_string.c_str() + strlen(your_string.c_str());
Однако я бы предпочел первый подход (с использованием адреса разыменованного итератора), потому что:
a) Гарантируется работа с начальными / конечными совместимыми контейнерами, которые могут не иметь метода c_str. Так, например, если вы решили, что хотите, чтобы QString (использовалась строка QT) или AWS :: String или std :: vector содержали ваши символы, подход c_str () не сработает, но тот, который приведен выше, будет.
b) Возможно, не так дорого, как c_str () ... который, вообще говоря, должен быть реализован аналогично вызову, который я сделал во второй строке кода, чтобы получить адрес, но не гарантированно будет реализован таким образом (например, если используемая вами строка не заканчивается нулем, для добавления нулевого терминатора может потребоваться перераспределение и мутация всей строки ... что внезапно сделает ее поток небезопасным и очень дорогостоящим, это не относится к std: : строка, но может быть для других типов строк)
c) Он лучше передает намерение, в конце концов, вам нужен адрес, и первая группа кода выражает именно это.
Так что я бы сказал, что этот подход лучше для:
Ясность, совместимость и эффективность.
Edit:
Обратите внимание, что при любом подходе, если вы измените свою исходную строку после получения адреса, адрес будет признан недействительным (поскольку строка может быть перемещена). Компилятор не предупредит вас об этом, и это может привести к очень неприятным ошибкам: /