char * 与 char[] 的区别

char * 与 char[] 的区别

直接上代码:
#include <cstring>
int _tmain(int argc, _TCHAR* argv[])
{
	char *a = "xxxxxxxxxxxx";
	char b[] = "xxxxxxxxxxxx";
	int i = 10;
	int cmp = strcmp(a,b);
	if (cmp == 0)
	{
		printf("%s\t%s\n",a,b);
	}
	//memcpy((void *) a,(void *) b,10); 函数里修改了 *a 的值,会崩溃
	//a[0] = 'a';//会崩溃
	b[0] = 'a';
	printf("%s\n",b);
	printf("&(*a)=%x\t&b=%x\t&i=%x",&(*a),b,&i);
	return 0;
}


 结果是: 
  
a 和 b 打印出来是完全一样的,但是 有几点 是不一样的:
1. a 是指针 ,他可以 重新指向 另一个字符串,而b 是一个 地址常量,指向的空间不可变。
2.
char *a = "xxxxxxxxxxxx";
char b[] = "xxxxxxxxxxxx";
两个 "xxxxxxxxxxxx"  不在 同一片 存储 空间里。
第一个 的地址 是 常量地址空间,第二个的地址  和 整形变量 i 的存储空间一致,在一个栈区。
所以导致 a[0] = 'a' 会崩溃 ,b[0] = 'a' 不会。

第2点扩展:在使用C标准库的一些函数里,如果修改了 *a 的内容 ,程序会崩溃。
例如 strcpy(a,b) ,memcpy(a,b)  而 strcmp 没有改变 *a 的内容,不会产生崩溃。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值