📄 subject_50981.htm
字号:
<p>
序号:50981 发表者:coolleo 发表日期:2003-08-28 10:17:31
<br>主题:请高手看看,关于const
<br>内容:请问下面这两句为什么正确<BR>int i=-1;<BR>const int ic=i;<BR>i 是变量,而ic是常量,=的左右值不是同类型的啊?怎么能将变量付给常量呢?<BR>如果上面成立,而下面<BR>string s1="abc"<BR>char * str=s1.c_str()为什么错,c_str返回const char *,为什么常量不能付给变量呢?<BR>不懂啊,搞不懂啊,各位看官请畅所欲言吧
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:coolleo 回复日期:2003-08-28 10:27:05
<br>内容:是不是对于指针或引用来讲,=的左右值才必须是同类型(不包括强转换)?<BR>也就是说<BR>const int ic=5<BR>int i=ic,也是ok的?<BR>而int i=5<BR>const int * ic=&i,是错误的,呵呵,我好象懂了.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lijb 回复日期:2003-08-28 10:39:40
<br>内容:下面理解是对的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:哈哈黑 回复日期:2003-08-28 12:08:43
<br>内容:const int* ic是指针定义,表示指针ic指向的对象是常量,所以不能指向变量。<BR>constint i=5;<BR>int c=6<BR>const int * ic=&i;<BR>ic=&c;<BR>这样是可以的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:jinir 回复日期:2003-08-28 12:55:05
<br>内容:const void * 转换为 void * 是一个非常危险的动作,几乎是一个错误,是指针操作的一个违规现象, C++只保留了有限的转换操作,屈服于C中继承而来的习惯用法,如:<BR>char *s="abc";
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:coolleo 回复日期:2003-08-28 15:04:11
<br>内容: 谢谢大家<BR>现在我已经发现<BR>而int i=5<BR>const int * ic=&i,是正确的,可是i是变量啊,不能阻止i=6这样的操作,只是如果通过ic改变i的值会报错,<BR>那么<BR>const int *表示指针ic指向的对象是常量,它的着重点是不能通过IC本身改变指向的对象,还是指向的对象本身不能改变<BR><BR>我以为我明白了,结果我又糊涂了.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:jinir 回复日期:2003-08-28 18:04:07
<br>内容:const int * 是指向常量的<BR>int * const 是指向常地址的<BR>const int * const 是……<BR>不好意思,我晕了,建议看<<Thinking in C++>>,有一单就是const的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:哈哈黑 回复日期:2003-08-29 00:11:28
<br>内容:const int* ic=常量地址,是指针定义,表示指针ic指向的对象是常量。它是限制对指针的间接引用,即防止在指针操作中出现*ic=8;这样的改变常量的错误。但指针本身还是变量,所以可以指向变量,同时也不会限制变量的操作,但是你对所指向的变量不能用*ic=8;这样的间接引用来改变。这样就防止了在指针操作中对指针的间接引用有可能改变常量的错误。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-08-30 12:11:14
<br>内容: 我想提点我的看法,const int * h=地址(变量或则常量都行)这样的指向常对象的指针h是不管我们到底给它赋的是不是常量,编译器会保证我们不能通过指向常对象的指针h来更改任何h所指向的任何对象(h所指向的对象有可能是常对象,也可能是非const对象)。所以,一般我们是在函数形参里这么用。至于指向常对象的指针h所指向的对象是const对象的话,被指向的const对象本身是不能被改的,但这可不是'const int * h=地址'的功劳。因为定义肯定是这样的,const int k=10;(是这里的const告诉编译器k不能被更改)。而指向常对象的指针h所指向的对象是非const对象的话,既int kk=10;那kk自身可自由被改变。但,指向常对象的指针h指向kk的话,编译器是不允许我们通过指向常对象的指针h来改变kk的。而指向常对象的指针h本身是个变量,可以被反复赋值。但,赋值是有前提的。既只能是指向‘非常对象的指针’可以被赋值给‘指向常对象的指针’,但指向常对象的指针是不允许被赋值给‘非常对象的指针’的。既 int i=10;int j=11;int *h=&i;const int *d=&j;d=h;(合法)h=d;(非法) 非法的原因是因为指针的赋值本质上是最后两个指针都指向同一个对象了。如果h=d;也合法的话,那又会发生和我们意图不一致的情况了。千万要明白,我们利用指向常对象的指针是不想更改被指向的对象。哎呀,说的有点罗嗦。我都累了!至于年int * cosnt 是另外一回事,不说了!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:coolleo 回复日期:2003-08-30 13:41:53
<br>内容:谢谢各位,懂了很多,谢谢.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -