字符串数组和指针指向的字符串的区别

C和C++中,字符串都以'\0'结尾,这样我们就能很方便的找到字符串的尾部,但由于这个问题,每个字符串都有一个额外字符的开销,稍不留神就会造成字符串的越界。例入下面的代码:

int main()
{
	char s[10];
	char a[] = "0123456789";
	strcpy(s, a);

	cout << s << endl;
	return 0;
}
这个程序的结果是程序会奔溃,因为s只申请了10个字节,而a加上'\0'有11个字节,放不下,所以会奔溃

那我们来继续看下面的代码,猜猜程序的结果:

int main()
{
	char a[] = "nihao";
	char b[] = "nihao";

	char *p = "nihao";
	char *q = "nihao";

	if (a == b)   // 不相等
	{
		cout << "相等" << endl;
	}
	else
	{
		cout << "不相等" << endl;
	}
	if (p == q)//相等
	{
		cout << "相等" << endl;
	}
	else
	{
		cout << "不相等" << endl;
	}

	return 0;
}

运行的结果是不是有点出乎意料?

那是因为,我们会给字符串数组a和b分配两个空间,并吧“nihao”分配到数组空间中去,因为起始地址不同,所以两个数组不同
p和q是两个指针,我们无需为他们分配内存空间用来存储字符串的内容,只需要把他们指向"nihao"在内存中的地址就行了
由于“nihao”是个常量字符串,它在内存中只有一个拷贝,因此p和q指向的是同一块地址,所以相同。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值