从上面一节中“既然搞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函数中调用该函数的时候,字符指针变量和数组变量,哪个可以返回值?答案是字符指针变量,因为栈的声明周期就是{}内。
是不是有点佩服了?学的不够深入,还需加油!