先上一段代碼:
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就在棧區裏面了,上面的操作就把這組常量的地址賦給了指針,當編譯器知道兩個字符串是一樣的就開始摳門(優化)了,在存儲到內存四區的時候把兩個合成爲一個 ,節約地址空間,同一個常量那不就是同一個地址了
【溫故而知新】