OsChina上一個朋友給出的例子,很能說明問題:
typedef char * CharPtr;
const CharPtr mycharptr = "Hello, World";
mycharptr[0]='h'; //OK[1]
mycharptr = "It's Wrong"; //Err[2]
如果把CharPtr替代掉的話,那麼似乎[1]是錯的,[2]是對的,因為const char *是指向const char的指針,指針可以指向别的,但是指向的内容不能變。實際上,const隻是編譯器的一種規範,是以編譯的時候隻按照文法檢查是不是改變了,char*被typedef之後,可以當成一種簡單類型看,那麼const CharPtr 就隻一個CharPtr型的常量,對它的指派肯定會引起編譯錯誤,而[0]這種尋址并不影響。
不過,如果把typedef 改為宏替換(如下),事情就不一樣了,畢竟宏替換隻是一種替換而已,不會引起編譯器的檢查,編譯之前,CharPtr就已經被替換掉了。
#define CharPtr char *
const CharPtr mycharptr = "Hello, World";
mycharptr[0]='h'; //Err
mycharptr = "It's Wrong"; //OK