先上一段代码:
char* getstr1()
{
char *p1 = "abcdefgh";
return p1;
}
char* getstr2()
{
char*p2 = "abcdefg";
return p2;
}
void main()
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getstr1();
p2 = getstr2();
printf("1:%s \n2:%s\n\n", p1, p2);
printf("1:%d \n2:%d\n", p1, p2);//打印p1p2的值(地址数值)
system("pause");
return;
}
输出结果:
嗯,没毛病, 现在把char *p1 = "abcdefg"; ,即和p2一样了,
再看结果:
咦,这是怎么肥事,p1和p2的指针跑一块去了?
由此,找到内存四区的概念:
内存四区:1、栈区 2、堆区 3、全局区 4、代码区
那么上面的问题就可以理解了;
字符串作为一组常量在全局区里面,p就在栈区里面了,上面的操作就把这组常量的地址赋给了指针,当编译器知道两个字符串是一样的就开始抠门(优化)了,在存储到内存四区的时候把两个合成为一个 ,节约地址空间,同一个常量那不就是同一个地址了
【温故而知新】