透析string的c_str()函数

string定义了与c++和c语言的接口,通过c_str()函数,就能够得到C风格的字符串。它和string对象中存储的字符串有什么关系呢?我们可以做些实验来看看这个函数究竟是什么名堂。


c_str()的返回值是 const char * 类型的指针, 即不能对它指向的值进行修改, 为什么要设计成返回不能修改所指向的值的指针,原因就是这个指针所指向的内存和string对象中存放字符串的内存是同一片区域,如果你对这片内存进行修改,那么string对象的值也会改变,下面代码实验一下:


int main()
{
	string s = "hello world!";
	const char *p = s.c_str();
	char *p2 = (char *)p;
	p2[0] = 'W';
	cout<<s<<endl;
	
	return 0;
}

结果输出:Wello world!; 

这就说明,p2 和 p 所指向的内存和string中存放字符串的内存是同一片区域, 进一步可以推测,其实string类是在对c_str()所指向的字符串进行维护,不允许用户直接修改字符串,当然像上面一个给一个强制转换也可以实现直接修改,当c++的思路并不推荐这样操作,因为这样做会让用户拥有更多犯错误的机会,这也就是为什么这个函数返回值是const修饰的原因了。那么string类为什么要提供这种操作呢?是因为当在c++代码中调用c语言函数库完成某种操作时,需要这样的字符串作为参数。但是对于字符串本身操作,我们应该使用string提供的接口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值