有关int *,const int* 等

yangyzqo 2006-03-15 04:28:03
代码如下:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
const int iNum = 0x1024;
int *pNum = (int*)&iNum;
*pNum = 3;
//   const int * const pNum = &iNum;
// const int * const & pNum = &iNum;
cout<<"iNum: "<<hex<<"Add: "<<&iNum<<" Value: "<<iNum<<endl
<<"*pNum: "<<hex<<"Add: "<<pNum<<" Value: "<<*pNum<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}

以上程序在Dev-C++ 4.9.9.2上测试通过,输出结果如下:
iNum: Add: 0x22ff74 Value: 1024
*pNum: Add: 0x22ff74 Value: 3

现有以下问题请教:
1。 const int * const & pNum = &iNum;此句不理解
2。输出结果中显示:pNum与&iNum相同,但为什么值不同呢?
3。//   const int * const pNum = &iNum;
// const int * const & pNum = &iNum;
这两句有什么区别呢?有什么实用性呢?
还有其它问题,不知道怎么表达,总之觉得此程序有些怪怪的.
请指教,谢谢!
...全文
268 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanchuang 2006-03-16
  • 打赏
  • 举报
回复
前面的没有看,就回复你这贴:
如果如ykzhujiang(朱朱) 有解释,那么以下语句怎么确定呢?
const int iNum = 4;
char szTest[iNum];
int *pNum = (int *)&iNum;
*pNum = 5;
此时szTest的大小又是多小呢?
---------------------------------------------------------
不管你如何改变,iNum的值都是4。其实你知道有个关键字是volatile是叫程序使用这个变量时,到内存里去读取值的。换句话说,有时候编译器对代码优化后,如果在程序里变量没有变化的话,他将直接使用变量上次使用的值。
但对于const修饰的变量,程序是不会到内存里读去值的,他使用的都是最初的值。所以iNum空间里的值变了并不对iNum在程序中的使用产生影响。
yangyzqo 2006-03-16
  • 打赏
  • 举报
回复
如果如ykzhujiang(朱朱) 有解释,那么以下语句怎么确定呢?
const int iNum = 4;
char szTest[iNum];
int *pNum = (int *)&iNum;
*pNum = 5;
此时szTest的大小又是多小呢?

谢谢!
yangyzqo 2006-03-16
  • 打赏
  • 举报
回复
谢谢ytfrdfiw()
这个问题算是明白了一点点,

问题:输出结果中显示:pNum与&iNum相同,但为什么值不同呢?
还是有些不明白,特别是healer_kx(甘草) 与ykzhujiang(朱朱) 的解释有些不同
另,如果真如healer_kx(甘草) 的解释,请问C++中的const_cast又意义何在呢?

谢谢!
ytfrdfiw 2006-03-15
  • 打赏
  • 举报
回复
我开始也看不懂,现在大概懂了。
同时在87页有这么一段话:

引用在内部存放的是一个对象的地址它是该对象的别名对于不可寻址的值如文字
常量以及不同类型的对象编译器为了实现引用必须生成一个临时对象引用实际上指
向该对象但用户不能访问它例如当我们写
double dval = 1024;
const int &ri = dval;
编译器将其转换成
int temp = dval;
const int &ri = temp;
如果我们给ri 赋一个新值则这样做不会改变dval 而是改变temp 对用户来说就好像修改动作没有生效这对于用户来说这并不总是好事情const 引用不会暴露这个问题因为它们是只读的不允许非const 引用指向需要临时对象的对象或值一般来说这比允许定义这样的引用但实际上不会生效的方案要好得多.


const int ival = 1024;
int *&pi_ref = &ival; // 错误: 要求一个const 引用
//pi_ref是一个引用,且是一个int*型的引用,即在内部有另一个指针指向&ival.
按照上面的推断,若我们的pi_ref不为xonst,则我们可以修改pi_ref,但此时不会改&ival,这样就是上面lippman提到的问题。改变ri不会改变dval.
同样的,ival本身是一个常量,若我们不用const修饰*pi_ref,则我们可以重新对*pi_ref赋值,e.g:*pi_ref = 999;但此时,因为我们的引用的对象ival是不可以更改的,所以为访止出现引用更改,但引用对象本身未更改的现象,编译器对此种情况进行了报错出理。
不知你是否理解了,不解我们可以再讨论。

design_sky 2006-03-15
  • 打赏
  • 举报
回复
楼主蛮认真的嘛
njuzgj 2006-03-15
  • 打赏
  • 举报
回复
MARK
yangyzqo 2006-03-15
  • 打赏
  • 举报
回复
lippman的c++ primer提到,中文版88页.
---------------
呵呵,谢谢,
我就是在这个书上看的,有些不明白,所以才来问的吗?
ytfrdfiw 2006-03-15
  • 打赏
  • 举报
回复
下面给出的例子很难在第一次就能正确声明我们希望用一个const 对象的地址来初始
化一个引用非const 引用定义是非法的将导致编译时刻错误
const int ival = 1024;
// 错误: 要求一个const 引用
int *&pi_ref = &ival;
下面是我们在打算修正pi_ref 定义时首先想到的做法但是它不能生效——你能看出来
这是为什么吗
const int ival = 1024;
// 仍然错误
const int *&pi_ref = &ival;
如果我们从右向左读这个定义会发现pi_ref 是一个指向定义为const 的int 型对象的指
针我们的引用不是指向一个常量而是指向一个非常量指针指针指向一个const 对象
正确的定义如下
const int ival = 1024;
// ok: 这是可以被编译器接受的
const int *const &pi_ref = &ival;
指针和引用有两个主要区别引用必须总是指向一个对象如果用一个引用给另一个引
用赋值那么改变的是被引用的对象而不是引用本身
ytfrdfiw 2006-03-15
  • 打赏
  • 举报
回复
lippman的c++ primer提到,中文版88页.
yangyzqo 2006-03-15
  • 打赏
  • 举报
回复
const int * const & pNum = &iNum;此句不理解
指针常量,是说该指针处内容不能被修改。
--------------------
还是不明白什么意思

我主要想问的是第二个const为什么必须要?

以下语句就可以通过
     const int iNum = 1234;
const int * pNum2 = &iNum;
const int * const &pNum3 = pNum2;
但为什么直接用 const int * &pNum3 = &iNum;就不行呢?
谢谢
healer_kx 2006-03-15
  • 打赏
  • 举报
回复
编译的时候,编译器不会意识到你的流程哪里会取它的地址的。
const value被引用,是编译期间就完成的。

值是不是变了,你看内存就可以了。
ykzhujiang 2006-03-15
  • 打赏
  • 举报
回复
楼上的,我开始也是这样理解的,不过我记得tic上面有说过如果,如果一旦程序中对于const value进行取址操作的话,那么就不会进行替代了
healer_kx 2006-03-15
  • 打赏
  • 举报
回复
const int * const & pNum = &iNum;此句不理解
指针常量,是说该指针处内容不能被修改。

你的问题是这样的。
你的iNum 是CONST VALUE,有引用它的地方,编译器会直接把那里记为0x1024,.

而实际在运行期间,那里的值已经发生变化了。是3了。

所以cout<<iNum 实际上是 cout<<0x1024; !!!!

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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