堆、棧、全域性區靜態區、文字常量區、程式程式碼區
阿新 • • 發佈:2019-01-23
一、記憶體結構圖:
二、程式碼示範區:
三:案例分析:
char ch[]="abc";
表示ch 是一個足以存放字串初值和空字元'/0'的一維陣列,可以更改陣列中的字元,但是char本身是不可改變的常量。
char *pch = "abc";
那麼pch 是一個指標,其初值指向一個字串常量,之後它可以指向其他位置,但如果試圖修改字串的內容,結果將不確定。
______ ______ ______
ch: |abc\0 | pch: | ◎-----> |abc\0 |
______ ______ ______
總結如下:
1. char[] p表示p是一個數組指標,相當於const pointer,不允許對該指標進行修改。但該指標所指向的陣列內容,是分配在棧上面的,是可以修改的。
2.
char * pp表示pp是一個可變指標,允許對其進行修改,即可以指向其他地方,如pp = p也是可以的。對於*pp =
"abc";這樣的情況,由於編譯器優化,一般都會將abc存放在常量區域內,然後pp指標是區域性變數,存放在棧中,因此,在函式返回中,允許返回該地址
(實際上指向一個常量地址,字串常量區);而,char[] p是區域性變數,當函式結束,存在棧中的陣列內容均被銷燬,因此返回p地址是不允許的。