c/c++之string与char及char *与char[]区别

c语言中:
string 定义的是字符串,用双引号,string t="abcdd";
char 定义的是单个字符,用单引号,char t='a';
c++中,定义字符串有两种:
分别用char和string

char *p="abcdd";
char p[]="abcd";
string p="abcdd";

string是指标准模板库中的std::string,这个就是所谓的字符串类,它具有非常强大的字符串处理能力。可以定义不定长度的字符串,且内存的分配与回收均由它自己负责,而不是程序员负责;它支持很多种操作,如对字符串的附加,截取,获取字符串长度等等。还有它可以配合算法进行各种运算。

char*与char[]区别:
先看一下这段代码:

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << (str1 == str2) << endl; 
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;
cout << (str7 == str8) << endl;
结果是0 0 1 1

下面分析一下内存分布问题:

char str1[] = “abc”:

这里的"abc"是一个常量,首先会在常量存储区里存储"abc"这个常量,然后会因为"abc"被赋值给str1[],所以在栈中开辟一段内存,内存大小为4个节点(char数组后会自动加一个’\0’),然后又有一个"abc"被保存在栈中。
同理,str2[]中的"abc"也是保存在栈中,地址不同。 到此,有三个"abc"被保存起来,一个在常量存储区,另外两个在栈中。

注意:c++内存被分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

const char str3[] = “abc”:

对于这种被const修饰起来的变量,一般也是被保存在常量存储区,但是对于const数组来讲,系统不确定符号表是否有足够的空间来存放const数组,所以还是为const数组分配内存的。所以str3指向的是栈上的"abc"。
同理,str4[]也是保存在栈中,地址不同。

const char *str5 = “abc”:

因为"abc"在常量存储区中保存有一份(即使没保存,这样的操作也会新建一份),这里str5定义的时候,str5就可以开心的直接指向"abc"所在的常量区的地址。
同理str6,str7,str8,此时与const没有关系,const是底层const,表示指针所指向字符串不能被改变,但是该指针的指向可以改变。。

彩蛋如下:

	char ch1 = 'a';
	char ch2 = 'a';
	const char ch3 = 'a';
	const char ch4 = 'a';

	cout << (ch1 == ch2) << endl;
	cout << (ch3 == ch4) << endl;
	cout << (ch1 == ch4) << endl;
	结果是:1 1 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值