CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

const *p 的问题

楼主xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)2006-01-25 16:58:03 在 C/C++ / C++ 语言 提问

先看看书上(C++   Perimer)说的话:  
   
   
  我们可以定义一个const   指针指向一个const   或一个非const   对象例如:  
  int   errNumb   =   0;  
  int   *const   curErr   =   &errNumb;  
  curErr   是指向一个非const   对象的const   指针,这意味着不能赋给curErr   其他的地址值但可以修改curErr   指向的值.  
   
  试图给const   指针赋值会在编译时刻被标记为错误  
  curErr   =   &myErrNumb;   //   错误  
   
  指向const   对象的const   指针的定义就是将前面两种定义结合起来例如:  
  const   double   pi   =   3.14159;  
  const   double   *const   pi_ptr   =   π  
  在这种情况下pi_ptr   指向的对象的值以及它的地址本身都不能被改变.  
   
  =========================================================================================  
  下面是我说的:  
  他的意思就是说const型的指针一旦指向了一个const或非const   的变量,那这个指针就不能指向其他的变量了,我理解的对吗?如果我理解的对,看下面这个程序,如果我理解的不对,请指出!  
  #include<iostream>  
  using   namespace   std;  
  int   main()  
  {  
  const   int   arr=100,*p;  
  int   a=200;  
  p=&arr;  
  p=&a;  
  cout<<*p<<endl;  
  return   0;  
  }  
   
  程序(VS6测试通过)中的p一开始指向的是arr,但是我改变其指向叫其指向了a,但是没报错啊,请问怎么回事?  
  问题点数:20、回复次数:8Top

1 楼MarcoCC(成长与不断的跌倒和失败)回复于 2006-01-25 17:07:24 得分 0

你这当然不会错了,  
  上面说的是:  
  int   *const    
  你声明的是:  
  const   int   *Top

2 楼steedhorse(晨星)回复于 2006-01-25 17:13:33 得分 20

第一,“const   int   *p”并非“int*   const   p”,这一点楼主要仔细看书,区别开来。前者是不可修改指向的内容,后者是不可修改指针本身。而“const   int*   const   p”才是既不能修改指针本身,又不能修改指针指向的内容。  
   
  第二,不管是什么p,“初始化”是指定义时直接进行的初始化,比如:  
  const   int*   p   =   &i;  
  int   *const   p   =   &i;  
  之后都是赋值。所以,“一开始指向的是arr,但是我改变其指向叫其指向了a”这句话是不对的,楼主的那个p一开始的时候指向了随机的地方(没有初始化),后来才指向了arr(通过赋值),再后来才指向了a。  
   
  第三,尽量不要在同一行里定义或声明多个变量,尤其是一般变量跟指针变量混和更应避免,否则很容易让人误解。  
  Top

3 楼Cantonese00((⊙_⊙))回复于 2006-01-25 17:28:16 得分 0

#include<iostream>  
  using   namespace   std;  
  int   main()  
  {  
  int   arr=100,*p;  
  int   a=200;  
  p=&arr;  
  *p=1;  
  cout<<*p<<endl;  
  return   0;  
  }  
  #include<iostream>  
  using   namespace   std;  
  int   main()  
  {  
  const   int   arr=100,*p;  
  int   a=200;  
  p=&arr;  
  *p=1;  //error   C2166:   l-value   specifies   const   object  
  cout<<*p<<endl;  
  return   0;  
  }  
  -------------------------------------  
  LZ理解一下...  
  他的意思就是说const型的指针一旦指向了一个const或非const   的变量,那这个指针就不能指向其他的变量了,我理解的对吗?//  
  这个const要看看它的具体位置在哪:const主要是修饰它紧跟着那个变量:  
  我们可以定义一个const   指针指向一个const   或一个非const   对象例如:  
  int   errNumb   =   0;  
  int   *const   curErr   =   &errNumb;  
  curErr   是指向一个非const   对象的const   指针,这意味着不能赋给curErr   其他的地址值但可以修改curErr   指向的值.  
   
  试图给const   指针赋值会在编译时刻被标记为错误  
  curErr   =   &myErrNumb;   //   错误  
   
  指向const   对象的const   指针的定义就是将前面两种定义结合起来例如:  
  const   double   pi   =   3.14159;  
  const   double   *const   pi_ptr   =   &pi;  
  在这种情况下pi_ptr   指向的对象的值以及它的地址本身都不能被改变.  
  ----------------------------  
  要仔细到它的具体位置,才知道它是要谁为常量。Top

4 楼xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)回复于 2006-01-25 18:38:24 得分 0

指针的明白了谢谢各位!,请问:  
  int   const   a=10;  
  const   int   a=10;  
   
  有什么区别?Top

5 楼Rudy023()回复于 2006-01-25 20:48:27 得分 0

没有区别吧Top

6 楼aresfe(Ares)回复于 2006-01-25 22:12:36 得分 0

这个是没有区别的Top

7 楼ugg(逸学堂(exuetang.net))回复于 2006-01-25 22:23:18 得分 0

int   const   a=10;  
  const   int   a=10;  
  没有什么区别?都是定义常量Top

8 楼Cantonese00((⊙_⊙))回复于 2006-01-25 22:48:13 得分 0

呵呵...  
  const     int     a=10;      
  int     const     a=10;  
  是等效的    
  而:  
  const     int   *a;  
  表示a指向的内容(就是*a表一个值)不能通过a来修改,即如有*a=1的赋值行为将会出错。  
  int   *   const   a;  
  表示a是不能改变的指针变量(就是a表一个地址),即有如a=1等的行为,将会编译出错。  
  Top

相关问题

  • const char* const* const* p;
  • char const *p和char * const p区别?
  • 有这个吗? int const *p;
  • const char* p 和char* const p有什么区别?
  • const int * p 和 int * const p 有区别吗?
  • const int p不能被转化为int p?
  • const?
  • const
  • P
  • &*p

关键词

  • 指针
  • curerr
  • 指向
  • const
  • arr
  • 定义
  • 对象
  • 值
  • 理解
  • pi

得分解答快速导航

  • 帖主:xyjchinese
  • steedhorse

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo