专题一:const 修饰的指针

daylove 2004-10-27 03:41:57
///////////////////////////////////////////
//文章标题:const 修饰的指针。
//整理时间:2004/10/27
//整理人: daylove
//来源: c++ primer
///////////////////////////////////////////

指针是c、c++里比较灵活的东东,稍微不注意就会引起错误,而const在这个时候出现似乎就是为了给指针找个好娘家,因为在飘也有累的时候,指针似乎安静了,真是如此吗?今天又看了大师的c++ primer,终于领会了它是怎么被驯化的。下面我把它帖上来和一些对此概念不清楚的朋友分享一下。

-----------------------
定义一个const对象的非const指针:
const double *cptr;
cptr 是一个指向double 类型的const 对象的指针。我们可以从右往左把这个定义读为cptr 是一个指向double 类型的被定义成const 的对象的指针。此中微妙在于cptr 本身不是常量我们可以重新赋值cptr 使其指向不同的对象但不能修改cptr 指向的对象。
例如:
const double *pc = 0;
const double minWage = 9.60;
// ok: 不能通过pc 修改minWage
pc = &minWage;
double dval = 3.14;
// ok: 不能通过pc 修改dval
// 虽然dval 本身不是一个常量
pc = &dval; // ok
dval = 3.14159; // ok
*pc = 3.14159; // 错误
const 对象的地址只能赋值给指向const 对象的指针例如pc 但是指向const 对象的指针可以被赋以一个非const 对象的地址,例如:
pc = &dval;
虽然dval 不是常量,但试图通过pc 修改它的值仍会导致编译错误。因为在运行程序的任意一点上,编译器不能确定指针所指的实际对象。

----------------------------
定义一个const 指针指向一个const 或一个非const 对象,例如:
int errNumb = 0;
int *const curErr = &errNumb;
curErr 是指向一个非const 对象的const 指针。我们可以从右拄左把定义读作curErr是一个指向int 类型对象的const 指针。这意味着不能赋给curErr 其他的地址值但可以修改curErr 指向的值。下面的代码说明我们可以怎样使用curErr:
do_something();
if ( *curErr )
{
errorHandler();
*curErr = 0; // ok: 重置指针所指的对象
}
试图给const 指针赋值会在编译时刻被标记为错误
curErr = &myErrNumb; // 错误

--------------------------------------------------------------
指向const 对象的const 指针的定义就是将前面两种定义结合起来,例如:
const double pi = 3.14159;
const double *const pi_ptr = π
在这种情况下pi_ptr 指向的对象的值以及它的地址本身都不能被改变。我们可以从右往左将定义读作pi_ptr 是指向被定义为const 的double 类型对象的const 指针。
...全文
564 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kv4000 2004-12-09
  • 打赏
  • 举报
回复
学习
zz841229 2004-11-01
  • 打赏
  • 举报
回复
有图就更好了
daylove 2004-10-31
  • 打赏
  • 举报
回复
const修饰的函数。
其形式有如下几种:
1、void fun( const type* temp )、void fun( const type& temp )
2、void fun( ) const
3、const & fun( )
---------------------------------------------------------------
1、调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const type* temp,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const type& temp,则不能对传递进来的引用对象进行改变,保护了原对象的属性,同时也提高了程序执行的效率。

2、如果一个成员函数的不会修改数据成员,那么可将该函数声明为const,因为const成员函数中不允许对数据成员进行修改。使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。其中,const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。下面举一例子说明常成员函数的特征。

3、此种情况说明函数返回的是一个const类型的引用。该引用所引用的对象不能被更新
polobo923 2004-10-31
  • 打赏
  • 举报
回复
懂了!谢谢!
sharkhuang 2004-10-31
  • 打赏
  • 举报
回复
c++ const还修饰函数可以讲讲
Kenny_Glacier 2004-10-31
  • 打赏
  • 举报
回复
学习学习
ScorpioCool 2004-10-30
  • 打赏
  • 举报
回复
>> >> const char * str = "abc";
>> >> 没有疑问,不能修改 *str 的结果。那么,
>> -------------------------------------------
>> 是不能通过指针str来修改结果,但可以修改str指针指向另一个地址.

不能修改 *str 就是这个意思了。

>> 这里相当于const char * const str
谢谢了。
daylove 2004-10-29
  • 打赏
  • 举报
回复
const char * str = "abc";
没有疑问,不能修改 *str 的结果。那么,
-------------------------------------------
是不能通过指针str来修改结果,但可以修改str指针指向另一个地址.


typedef const char * c_str;
const c_str str = "abc";
---------------------------------
这里相当于const char * const str
在这种情况下str 指向的对象的值以及它的地址本身都不能被改变
ScorpioCool 2004-10-29
  • 打赏
  • 举报
回复
请教一下

const char * str = "abc";
没有疑问,不能修改 *str 的结果。那么,
typedef const char * c_str;
const c_str str = "abc";
这个 str 是不是也不能再指向其它字符串了?也就是说,const c_str 是 const char * const 还是 const const char * 呢?谢谢!
daylove 2004-10-28
  • 打赏
  • 举报
回复
对啊,楼上的,我讲得实在不好,所以把书上的帖上来了,我想很多人平时都忽视了
grcnmq 2004-10-27
  • 打赏
  • 举报
回复
这不就是C++primer里面的东东吗?
goodluckyxl 2004-10-27
  • 打赏
  • 举报
回复
返回为const的类型
也讲述一下 漏掉了

^_^
mefit 2004-10-27
  • 打赏
  • 举报
回复
up
zhangfjj 2004-10-27
  • 打赏
  • 举报
回复
刚才回答了几个关于用const修饰指针的问题,这个贴真及时,建议置顶!
zhangfjj 2004-10-27
  • 打赏
  • 举报
回复
2楼,呵呵
dot99 2004-10-27
  • 打赏
  • 举报
回复
第一个up~~~一楼~

const TYPE *const type_name
还可以当#define用~~~~

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧