const常量定义数组大小

结果是不能编译通过,如下

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

 

posted @ 2015-11-14 18:43  witxjp  阅读(12380)  评论(0编辑  收藏  举报