# std::basic_string<CharT,Traits,Allocator>::c_str

< cpp‎ | string‎ | basic string

const CharT* c_str() const; |  | (C++11 前)
const CharT* c_str() const noexcept; |  | (C++11 起) (C++20 前)
constexpr const CharT* c_str() const noexcept; |  | (C++20 起)

返回指向拥有数据等价于存储于字符串中的空终止字符数组的指针。

该指针有范围 `[c_str(); c_str() + size()]` 为合法，且其中的值对应存储于字符串的值，且在最后位置有个附加的空终止字符。

从 `c_str()` 获得的指针可能被下列行为非法化：

- 传递给任何非标准库函数字符串的非 const 引用，或
- 在字符串上调用非 const 成员函数，包括 operator[] 、 at() 、 front() 、 back() 、 begin() 、 rbegin() 、 end() 及 rend() 。

通过 `c_str()` 写入字符数组是未定义行为。

`c_str()` 与 data() 进行同一功能。 | (C++11 起)

### 参数

（无）

### 返回值

指向底层字符存储的指针。

对于每个 `[0, size())` 中的 `i` 有 c_str()[i] == operator[](i) 。 | (C++11 前)
对于每个 `[0, size()]` 中的 `i` 有 c_str() + i == std::addressof(operator[](i)) 。 | (C++11 起)

### 复杂度

常数。

### 注意

从 `c_str()` 获得的指针可以只当做一个指向空终止字符串的指针，若 string 对象不含其他空字符。

### 示例

    #include <algorithm>
    #include <cassert>
    #include <cstring>
    #include <string>

    int main()
    {
      std::string const s("Emplary");
      assert(s.size() == std::strlen(s.c_str()));
      assert(std::equal(s.begin(), s.end(), s.c_str()));
      assert(std::equal(s.c_str(), s.c_str() + s.size(), s.begin()));
      assert(0 == *(s.c_str() + s.size()));
    }

### 参阅

front (C++11) | 访问首字符 (公开成员函数)
back (C++11) | 访问最后的字符 (公开成员函数)
data | 返回指向字符串首字符的指针 (公开成员函数)