在程序中const出现在各种场合,const的不同位置往往造成初学者的疑惑,如const int val; int const val; int cont *p; const int *p; int *const p; const int *const p;等等。那么这些用法到底有什么区别呢?
1.从const本身展开
const意思为限定,也就是一旦赋值不能修改。
关键在于(重点):const到底限制的是哪个方面。
2、各种const位置的含义区别
(1)const int val; 与 int const val;
这两种含义是一致的。为什么呢?const int val 表明 const限定的是(int val),这跟限定val(其类型为int)的含义从理解上来说也是一样的。
这两者都表明 val定义时就需要初始化,且后来不能更改这个值。
(2)const int *p 与int const *p
这两者也相同,解释同上,都表明p指针指向的对象是被限定的(p指针自认为指向的对象是被限定的)。这句话的意思是说,p指针既可以指向cosnt对象,也可以指向非const对象。但是,p指针不管对象是否为const它都认为是const对象,也就是说指向好后,不能用对p指针解引用的方式来修改对象的值。
(3)int *const p
这里,const限定指针p,即需要初始化p指向的对象。一旦初始化后,即不可再修改p(让p指向其他int对象)。但是,由于前面无const,因此可以通过p对指向的对象赋值。如:
int a, b;
int *const p = &a;
p = &b; (error)
*p = 10; (OK)
(4)const int *const p 与 int const *const p
这两种类型也是一样的,都进行了双重限定,a、限定p b、限定p所指向的对象。由于这里限定了p,所以定义时需要初始化,并且不能再变更。可以指向const和非const对象。