結果是不能編譯通過,如下
大致意思是常量size2是用變量temp定義的,所以size2的值是不固定的,不固定的值當然是不能夠用來定義數組的,因為編譯器在編譯的時候就需要知道給數組分配多大空間,而變量的值在運行時有可能變化。
將char str2[size2]這句去掉是可以編譯通過的,這說明const常量是可以通過變量初始化的。只是在初始化之后就不可以再修改了。
這些規則其實都是編譯器行為。
這個題讓我想起了const與數據,指針的組合。
(1)常量數據: const int n, int const n
(2)常量指針: int * const p
(3)指向常量數據的指針: const int * p, int const * p
(4)指向常量數據的常量指針: const int * const p, int const * const p
看的讓人眼花繚亂,其實很好記,
在有*和const的情況下,先看*和const的位置,只有const在*之后,這個const修飾的才是指針,在*之前,這個const修飾的都是數據。所以常量指針只有一種表示(* const)
而在沒有*和有*但const在*之前的情況下,const修飾的都是數據,所以(const *)這種情況修飾的一定是數據,而數據int與const的位置又有2種,int const,和const int。
再來解釋一下上述4種情況的含義
(1)常量數據: const int n, int const n ->這個數據一旦初始化,就不可以再更改,即使想間接的通過指針修改也不可以,所以它只可以賦值給指向常量數據的指針。
(2)常量指針: int * const p ->這個指針的值一旦初始化,就不可以再更改,即指針不可以再重定向,指向了固定的地址,但可以通過(*p)修改這個地址的值。即它指向的不是常量數據。
(3)指向常量數據的指針: const int * p, int const * p ->這個指針指向的地址是可以修改的,但不可以通過(*p)修改該地址處的值。
(4)指向常量數據的常量指針: const int * const p, int const * const p->這個最嚴格,期指針的值不可修改,其指向的地址處的值也不可修改。