请帮忙分析下C++指针程序

#include<iostream>usingnamespacestd;voidmain(){constintp=4;cout<<p<<endl;int*h=(int*)... #include<iostream>
using namespace std;
void main()
{
const int p=4;
cout<<p<<endl;
int *h=(int *)&p;
*h=8;
cout<<p<<endl;
cout<<*h<<endl;
cout<<&p<<endl;
cout<<h<<endl;
}

运行结果:
4
4
8
0013FF7C
0013FF7C

我想详细的知道以上的程序运行结果为什么是这样的 重点讲拿高手应该会知道吧
我觉得我想知道的重点没说出来 首先P为常量 所以输出的P值不会变
我认为强制转换后h是指向P值的 也就是4 然后把这个指针执行的变量赋值为8 那指向的又是4 感觉很奇怪 到底这有什么区别
我以前看的时候觉得结果应该是这样的 但是仔细画了下图发现 首先指针存放的是变量的地址 不管是改变指针存放的值还是指向的值 都应该不会出现运行的结果才对(两个地址是一样的 但是值不一样 就是这想不通了) 希望高手精辟的指点下我的疑惑 弄懂指针的实质
展开
 我来答
百度网友ecb9fde54
2009-03-25 · TA获得超过187个赞
知道小有建树答主
回答量:76
采纳率:0%
帮助的人:64.2万
展开全部
如果每道题都这么有趣,那天天看知道也不会无聊了。

这个题相当有趣。而且,几乎没有资料仔细的解释过这个问题。

正确的符合标准C++的输出结果确实应该是4 。

分析一下你的操作:

你取他的地址,你确实取到了,这是真的。

你利用这个地址修改其中的值,你也确实修改了那个地址的值,那个地址位置的内存中所保存的确实是你修改后的值8,这也是真的:原来恒量p所在的地址中的值现在是8。

为什么输出是4的原因,其实打印语句根本没有跑去内存里面读那个地址的值,而是直接把一个常量‘4’扔给cout了。这是编译器做的手脚。目的是为了符合C++标准:恒量不许被修改,即便是利用一个可以进行修改的指针指向这个恒量(标准规定这个指针可以被当作指向了这个恒量,但不必真的指向他,而且不可以通过这个指针修改恒量内容)。

举个例子说明一下编译器的行为方式:
const int i=10;
b(i);
会被编译器当成
const int i=10;
b(10);
来处理。
所以你无论把i所在的内存改成什么都无所谓,反正b收到的参数都是10.

实际上这个语法在C++里面可以当做替代预处理器的#define语句,而编译器处理他们的方式也基本是这个样子,就是扔个常量给他,不去读他们所在的内存。不变是const存在的意义,正因为有这个保证才能执行这样的操作:
const int a=10;
int b[a];
wangtaooooo
2009-03-24 · TA获得超过198个赞
知道小有建树答主
回答量:279
采纳率:0%
帮助的人:0
展开全部
0013FF7C
0013FF7C
这两个输出是指针 表示你的变量存的地址
由于你打印的时候写的是指针
所以人家以指针形式给你打引出来了

你画下指针的图就清楚的狠了
下面给你加了注释
#include<iostream>
using namespace std;
void main()
{
const int p=4;
cout<<p<<endl; 打印整形
int *h=(int *)&p; //取p的地址转化成整形指针类型
*h=8; //把这个指针执行的变量赋值为8
cout<<p<<endl; ;//正确输出应该为8吧
cout<<*h<<endl打印这个指针指向的变量
cout<<&p<<endl;//这是打印个指针 指针用十六进制表示
cout<<h<<endl; //同上
}

运行结果:
4 //打印普通整型
4
8
0013FF7C
0013FF7C
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
niinor
2009-03-24 · TA获得超过2246个赞
知道小有建树答主
回答量:2047
采纳率:0%
帮助的人:1447万
展开全部
#include<iostream>
using namespace std;
void main()
{
const int p=4;
cout<<p<<endl; 打印整形
int *h=(int *)&p; //取p的地址转化成整形指针类型
*h=8; //把这个指针执行的变量赋值为8
cout<<p<<endl; ;//正确输出应该为8吧
cout<<*h<<endl;//打印这个指针指向的变量
cout<<&p<<endl;//这个是输出p的地址
cout<<h<<endl; //这个是输出h这个指针所在的地址
}

楼上的其他的都对,但是
cout<<p<<endl; ;//正确输出应该为8吧
这个的注释错了,正确输出怎么会是8嘛,p仍然是整型4.

越分析发现这个代码越不简单...请允许我多修改几次.
最后的输出,p的地址,与h所在的地址是同一个地址,但是h指向的值是整型8...

p是const int,所以下面的代码不可能修改它的值与类型。所以p永远是int,等于4.
关键是int *h = (int *)&p;这一句。这一句其实是将p的地址作为h指向的地址。*h=8,只改变它的值,而没有改变h指向的地址。注意,是h所指向的内存地址,h本身的地址&h,是不一样的。
如果把const int p = 4;去掉,p的值就会被改变.所以肯定是编译器的保护机制起的作用.其实主要还是强制转换的副作用!

知道你问的不是那么简单的问题。我分析来看,就是编译器对const型的处理机制问题,强制转换的副作用也是一个原因。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
907009156
2009-03-24 · TA获得超过408个赞
知道小有建树答主
回答量:189
采纳率:0%
帮助的人:113万
展开全部
#include<iostream>
using namespace std;
void main()
{
const int p=4;
cout<<p<<endl; 输出整形的值4
int *h=(int *)&p; //取p的地址转化成整形指针类型
*h=8; //把这个指针执行的变量赋值为8
cout<<p<<endl; ;//输出值应该为4,p为const的常数,就是其内容不改变
cout<<*h<<endl;//输出这个指针指向的变量值为8
cout<<&p<<endl;//这个是输出p的地址 ,内存地址
cout<<h<<endl;
//这个是输出h这个指针所指的地址,和p是指向的同一个内存地址
}

内存模型就是
h里面存放p的强制类型转换后的地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式