const變數不能初始化陣列長度
為什麼下面的例子在使用一個const變數來初始化陣列,ANSI C的編譯器會報告一個錯誤呢?
const int n = 5;
int a[n];
答案與分析:
1) 這個問題討論的是“常量”與“只讀變數”的區別。常量肯定是隻讀的,例如5, "abc",等,肯定是隻讀的,因為常量是被編譯器放在記憶體中的只讀區域,當然也就不能夠去修改它。而“只讀變數”則是在記憶體中開闢一個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。C語言關鍵字const就是用來限定一個變數不允許被改變的修飾符(Qualifier)。上述程式碼中變數n 被修飾為只讀變數,可惜再怎麼修飾也不是常量。而ANSI C規定陣列定義時長度必須是“常量”,“只讀變數”也是不可以的。
2) 注意:在ANSI C中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而const int n,n只是一個變數(常量 != 不可變的變數,但在標準C++中,這樣定義的是一個常量,這種寫法是對的),實際上,根據編譯過程及記憶體分配來看,這種用法本來就應該是合理的,只是 ANSI C對陣列的規定限制了它。
3) 那麼,在ANSI C 語言中用什麼來定義常量呢?答案是enum型別和#define巨集,這兩個都可以用來定義常量。
二樓的回答言簡意賅,可惜我當時沒能理解。
原文連結地址:
--------------------------------------------------------------------------------------------------------------------------------------