char *p = "abcd"; 和 char a[] = "abcd"的区别

从上面一节中“既然搞C++,那就必须和内存管理做斗争”,大家是不是貌似都懂了C++的内存管理?如果这么想,那就来分析一道题吧!俗话说“黑猫白猫能抓老鼠就是好猫”。


请问:char *p = "abcd"; 和 char a[] = "abcd"的区别?指针p存储在什么区? 数组a存储在哪儿?它们有什么区别?

 

答案:指针p和字符数组都是在栈区,其中,"abcd"字面值在常量区,上面的区别是字符数组a会把常量区的"abcd"拷贝到栈中。那么字符数组a可以修改其中的元素,但指向字符的指针不能修改其指向的字符"abcd"。

下面,给出3个情节解释下答案说了个啥:

//char *p = "abcd";  和 char a[] = "abcd"的区别
void test()
{
	//1.情景1
	char *p = "abcd";
	//*p = 'b';            //运行的时候,报错:异常,写入访问权限冲突
	//因为:   *p中字符串字面值"abcd"存储在常量区,常量区的内容是不允许修改的
	printf("%c\n", p[0]);
	//2.情景2
	char a[] = "abcd";
	a[0] = 'b';          //运行没问题,修改成功
	//因为: 数组a中的值是存储在栈中的,程序会把常量区的"abcd"拷贝到栈中;这样它的内容就可以被修改了
	printf("%c\n", a[0]);
}

void main()
{
	test();
	//3.情景3
	char p[12] = "abcd";
	char *p1 = p;       //指针变量指向数组变量也可以 修改 
	p1[0] = 'H';
	printf("%s\n", p1);
	
	printf(p1);
	system("pause");
}
上面的情况同样说明一个问题:
char * getmemo()
{
char *p = "China";
char p[] = "China"
return p;
}
在main函数中调用该函数的时候,字符指针变量和数组变量,哪个可以返回值?答案是字符指针变量,因为栈的声明周期就是{}内。

是不是有点佩服了?学的不够深入,还需加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值