C++:带有const修饰的指针解读

总结:
const int *p:p可以指向别处,但不能通过 *p来操作p所指的数.(可以记为:const修饰 *p)
int const *p:和上面等效。

int * const p : p不能指向别处,但p所指的数可以用*p来操作.(记忆:const修饰p)
const int * const p :p不能指向别处,且p所指的数不能用*p来操作.(前一个const修饰 *p,后一个const修饰p)

注意:
上面的四个例子中,const的限制都仅对p有效,例如:

const int * const p = &i;  //取i的地址赋给p
i=2;  //编译正确.const限制仅对p指针操作有效,直接对i进行操作不受限制

通过实例来看看const所修饰的指针使用方法:
1、

先看一个普通的指针使用。

形式:int *pTmp

含义:一个普通的指向int类型的指针

int main(int argc, char *argv[])  
{  
  int i = 1;  

  int  *pTmp = &i;   
  printf("pTmp = %d\n", *pTmp);  

  i = 2;  
  printf("pTmp = %d\n", *pTmp);  

  (*pTmp)++;   
  printf("pTmp = %d\n", *pTmp);  

  system("PAUSE");  

  return 0;  
}  

输出:

pTmp = 1
pTmp = 2
pTmp = 3
请按任意键继续…
没有任何问题,pTmp指针你可以任意操作。

2、

形式:const int *pTmp

含义:表示pTmp所指向的对象是只读的,但pTmp可指向其他地址,即pTmp可变。

int main(int argc, char *argv[])  
{  
  int i = 1;  
  int j = 100;  

  const int *pTmp = &i; /*正确:表示pTmp所指向的对象是只读的,但pTmp可指向其他地址,即pTmp可变*/   
  printf("pTmp = %d\n", *pTmp);  

  i = 2;  
  printf("pTmp = %d\n", *pTmp);  

  pTmp = &j;            /*正确:将pTmp指向变量j的地址*/  
  printf("pTmp = %d\n", *pTmp);  


  (*pTmp)++; /*错误,pTmp指向的对象是只读的,编译出错提示:assignment of read-only location */  
  printf("pTmp = %d\n", *pTmp);  

  system("PAUSE");  

  return 0;  
}  

3、
形式:int const *pTmp

含义:与2相同, 表示pTmp所指向的对象是只读的,但pTmp可指向其他地址,即pTmp可变。

int main(int argc, char *argv[])  
{  
  int i = 1;  
  int j = 100;  

  const int *pTmp = &i; /*正确:表示pTmp所指向的对象是只读的,但pTmp可指向其他地址,即pTmp可变*/   
  printf("pTmp = %d\n", *pTmp);  

  i = 2;  
  printf("pTmp = %d\n", *pTmp);  

  pTmp = &j;            /*正确:将pTmp指向变量j的地址*/  
  printf("pTmp = %d\n", *pTmp);  


  (*pTmp)++; /*错误,pTmp指向的对象是只读的,编译出错提示:assignment of read-only location */  
  printf("pTmp = %d\n", *pTmp);  

  system("PAUSE");    

  return 0;  
}  

4、
形式:int * const pTmp

含义:pTmp不可修改,但pTmp所指向的对象可以修改。

int main(int argc, char *argv[])  
{  
  int i = 1;  
  int j = 100;  

  int * const pTmp = &i;   
  printf("pTmp = %d\n", *pTmp);  

  i = 2;  
  printf("pTmp = %d\n", *pTmp);  

  pTmp = &j;  /*错误,pTmp不可修改,编译提示:error:assignment of read-only variable `pTmp'*/  
  printf("pTmp = %d\n", *pTmp);  


  (*pTmp)++; /*正确,pTmp所指向的对象可以修改 */  
  printf("pTmp = %d\n", *pTmp);  

  system("PAUSE");    

  return 0;  
}  

5、
形式:const int * const pTmp

含义:pTmp不可修改,pTmp所指对象也不能修改。

int main(int argc, char *argv[])  
{  
  int i = 1;  
  int j = 100;  

  const int * const pTmp = &i;   
  printf("pTmp = %d\n", *pTmp);  

  i = 2;  /*正确*/  
  printf("pTmp = %d\n", *pTmp);  

  pTmp = &j;  /*错误:error: assignment of read-only variable `pTmp'*/  
  printf("pTmp = %d\n", *pTmp);  


  (*pTmp)++;  /*错误:error: increment of read-only location*/  
  printf("pTmp = %d\n", *pTmp);  

  system("PAUSE");  

  return 0;  
}  

总结:
const int *pint const *p等效,p可以指向别处,但不能通过 *p来操作p所指的数.(可以记为:const修饰 *p)
int * const p , p不能指向别处,但p所指的数可以用*p来操作.(记忆:const修饰p)
const int * const p ,p不能指向别处,且p所指的数不能用*p来操作.(前一个const修饰 *p,后一个const修饰p)

注意:
上面的四个例子中,const的限制都仅对p有效,例如:

const int * const p = &i;  //取i的地址赋给p
i=2;  //编译正确.const限制仅对p指针操作有效,直接对i进行操作不受限制

部分转自
http://www.cnblogs.com/dyx1024/archive/2012/05/13/2556671.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值