[转] const int *a与int *const a,const int *const a的区别

http://blog.csdn.net/zhangheng837964767/article/details/33783511

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里
1、const int *a
这里const 修饰的是int,而int定义的是一个整值
因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象
eg:
       const int *a = 0;
       const int b = 1;
       int c = 1;
        a = &b  //ok!  额外:注意不能通过a 来修改 b值
     a = &c  //ok!   额外:虽然c本身不是一个常量
     *a = 2  //erro! 为题就在这里,不能修改通过 *a 所指向的对象值,最后赋值得对象是c,因此不能通过*a 来修改c值。
2、int  *const a       
这里const修饰的是 a ,a代表的是一个指针地址
因此不能赋给a其他的地址值,但可以修改a指向的值
这有点和cont int *a相反的意味,例子就不说了

3、至于int const *a 和 const int *a 的意义是相同的 他们两个的作用等价

补充:
4、const int * const a 
这个代表a所指向的对象的值以及它的地址本身都不能被改变

5、 const int *const a

a所指向的对象及对象的值均不可改变。

关于const的点滴补充:
1、const 对象的地址只能赋值给指向const 对象的指针
2、指向const 对象的指针可以 被赋 以 一个非const 对象的地址 
3、指向const 得指针常被用作函数的形式参数,保证被传递给函数的实际对象在函数得实际对象在函数中不会被修改
4、常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误(上面都是在说明const得问题,所以没有赋值,实际语句中要赋值的)

 

  1、如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量
  2、因此,const int *a;和 int const *a;的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ; ,int *const a;为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的。
  3、const int* const a;为指针本身和指向的内容均为常量。


posted on 2017-12-23 17:25  mimime  阅读(1941)  评论(0编辑  收藏  举报