string、char*和字符串字面值的区别

1、string作为一个类在c++中存在,你可以通过所创建的string对象来调用不同的方法操纵该对象,例如通过+操作符来实习字符串的拼接,等等。也可以获取字符串的属性,例如长度。但用+或+=操作符时,两边的操作数至少要有一个是string对象。

2、但是char是作为一个基本类型,一个关键字在c/c++中存在(c++中没有string关键字),char* 很明显也就是一个指针。

3、C风格字符串是以'\0'字符结尾的字符数组
字符串字面值是以'\0'结尾的,const char组成的字符数组,位于常量区也就是说char *s="abc",内存中的常量区有一个字符串字面值"abc",s指针指向这个字符串字面值的首地址,实际上你如果试图用s作为迭代器解引用修改它所指向对象的值的话,是会报错的,所以s所指向的内容是不能改的
而且char *s1="abc" char *s2="abc",s1和s2其实指向的是常量区中同一个字符串字面值的首地址

而char s[] = "abc"确切的说是用字符串字面值初始化了一个字符数组,char s1[] = "abc"  char s2[] = "abc"是用同一个字符串字面值初始化了两个不同的字符数组,这里初始化的两个字符数组是可以修改的。你如果比较s1==s2,数组名字隐式转换为首地址,那么会得到false,因为指向的都不是同一个地方,这个时候你在用指针指向首地址进行修改操作就是合法的了

4、char * 是传统的基本串类型,带尾0的字符串,要一套专门的处理串的子程序;string 是面象对象的串对象,封装了许多函数,功能更强;这两个类型可以互相转换,但这是不同的类型,有的传统老式函数ifstream.open它的参数类型是char *,你就不能用string.

5、字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。

 


新加:

6、string类型,c++中才有,c中没有。种特殊的类。string 和 vector、list一样,都是标准库类型。 string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作,和字符数组比较起来,不必担心内存是否足够

7、申明一个字符串变量:string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串

8、c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式,一定要使用strcpy()函数等来操作方法c_str()返回的指针,不能直接赋值,因为string对象回析构掉,

比如:最好不要这样:

  char* c;

  string s="1234";

  c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理

  应该这样用:

  char c[20];

  string s="1234";

  strcpy(c,s.c_str());

  这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作




  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值