| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 339 人关注过本帖
标题:大家帮我看一下~~
只看楼主 加入收藏
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
结帖率:78.26%
收藏
已结贴  问题点数:5 回复次数:4 
大家帮我看一下~~
程序代码:
#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的值来改变?
搜索更多相关主题的帖子: color 
2011-05-20 11:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:0 
“强制类型转换了以后,i的值还是不能通过改变*p的值来改变? ”
------ 答案是“不知道”,对于强制类型转换带来的后果由程序员自己负责。
如果你在某个编译器上可以,那么恭喜你,但没法保证在所有编译器上都可以。
2011-05-20 12:12
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:3 
在调试状态下 进入到汇编代码当中去看看

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



2011-05-20 12:12
Toomj
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:257
专家分:1826
注 册:2011-5-17
收藏
得分:2 
是因为编译器在第一次扫描源文件时,将所有用到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就是用来限定一个变量不允许被改变,而且提高安全性
建议楼主不要轻易去改常量,不然你定义他来干嘛
2011-05-20 12:37
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
我明白了,谢谢给位的解答
收到的鲜花
  • hellovfp2011-06-02 12:13 送鲜花  10朵  
2011-05-24 12:09
快速回复:大家帮我看一下~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016984 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved