结果是不能编译通过,如下
大致意思是常量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->这个最严格,期指针的值不可修改,其指向的地址处的值也不可修改。