首先看看下面的代碼:
char *p;
p="abc";
你認為是對的嗎?
答案:文法上是對的,但不提倡這種寫法。
誤區1:沒有給p分配記憶體空間就賦值,怎麼會是對的呢?
正解:不少人第一眼將這裡的p="abc"看成了*p="abc",然後就做出了以上的論斷。這是比較笨笨的錯誤。
看清楚就好啦,其實賦給p的是"abc"的地址。再說,*p="abc"也不對呀,字串可不能這麼賦值。
誤區2:這"abcd"哪來的地址,怎麼能直接賦給p呢?
正解:先自己試試吧。在2K/XP +vc下運行這段這斷代碼,是不會出錯的,說明這段代碼並無問題。猜想的話呢,就是"abcd"不知道被放在了什麼地方,然後弄來了一個地址,給了p。
這到底是怎麼回事呢?
要知道,這兩個語句和char *p="abc"是完全一樣的,所以其中的道理也一樣。
char *p="abc"曾經迷惑了不少人呀。問問你:p到底是什麼類型的?char *?錯,是const char *!
也就是說,它所指向的內容是不可改變的。不過要補充的是,a的指向是可以改變的。
所以為了不再引起誤會,char *p="abc這種寫法是不提倡的。
既然char *p="abcd"被建議寫成const char *p="abcd",那麼char *p; p="abcd";也應該寫成const char *p; p="abcd";
講解:
const char *p="abc"中的"abc",在編譯期間就已經處理好,要了一塊記憶體,存起來了!
而char p[]="abc"中的"abc",是在運行期間動態分配記憶體給"abc",然後再算出地址,賦給p。
指標是沒有分配空間的地址而已,而數組是一種容器,佔用連續的儲存空間。
字串就該知道它是一個數組!而不是指標!
真正意義上的指標只能是地址,而它在分配了連續的空間後可以作為數組來使用。
引用字串的最佳格式是const char *指標,但char *指標是完全沒錯的。於情於理,也說的過去吧