注册 登录
编程论坛 C++教室

大家帮我看一下~~

棉雨 发布于 2011-05-20 11:14, 339 次点击
程序代码:
#include<iostream>
using namespace std;
void main()
{
    const int i=40;
    cout<<i<<endl;
    int *p;
    p=(int*)&i;//强制类型转换为变量//
    *p=90;
    cout<<i<<endl;
    cout<<*p<<endl;
    *p=100;
    cout<<i<<endl;
    cout<<*p<<endl;
}
强制类型转换了以后,i的值还是不能通过改变*p的值来改变?
4 回复
#2
rjsp2011-05-20 12:12
“强制类型转换了以后,i的值还是不能通过改变*p的值来改变? ”
------ 答案是“不知道”,对于强制类型转换带来的后果由程序员自己负责。
如果你在某个编译器上可以,那么恭喜你,但没法保证在所有编译器上都可以。
#3
寒风中的细雨2011-05-20 12:12
在调试状态下 进入到汇编代码当中去看看

编译器是这样子来实现的 i在栈上分配了地址
所以经过这句后  p=(int*)&i;//强制类型转换为变量//
i 的地址 和 p所指向的地址是一样的
所以通过*p 重新复制是改变啦地址单元当中的值的 所以 cout<<*p<<endl;
输出的结果就是改变后的值
 但是为什么 cout<<i<<endl;输出的全部都是原来的值?
原因是在这些要用到i输出的地方编译器全部换成了常量40进行压栈后再出调用过程(cout)输出



#4
Toomj2011-05-20 12:37
是因为编译器在第一次扫描源文件时,将所有用到i的地方都变成40,即第一次扫描之后,原文件变为:
const   int   i=   40;
cout   < <   40  < <   endl;//注意:此处的i已经被替换为40了
int   *p  =   (int   *)&i;
*p = 90;
cout   < <   40  < <   endl;//注意:此处的i已经被替换为40了



实在要改的话:
int   get(){   return   40;   }
const   int   i  =   get();
cout   < <  i  < <   endl;//显示“40”
int   *p   =   (int   *)&i;
*p = 90;
cout   < <   i < <   endl;//显示“90”
因为这次编译器在扫描时无法确定i的取值,所以无法完成“替换”。

const就是用来限定一个变量不允许被改变,而且提高安全性
建议楼主不要轻易去改常量,不然你定义他来干嘛
#5
棉雨2011-05-24 12:09
我明白了,谢谢给位的解答
1