
请帮忙分析下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 感觉很奇怪 到底这有什么区别
我以前看的时候觉得结果应该是这样的 但是仔细画了下图发现 首先指针存放的是变量的地址 不管是改变指针存放的值还是指向的值 都应该不会出现运行的结果才对(两个地址是一样的 但是值不一样 就是这想不通了) 希望高手精辟的指点下我的疑惑 弄懂指针的实质 展开
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 感觉很奇怪 到底这有什么区别
我以前看的时候觉得结果应该是这样的 但是仔细画了下图发现 首先指针存放的是变量的地址 不管是改变指针存放的值还是指向的值 都应该不会出现运行的结果才对(两个地址是一样的 但是值不一样 就是这想不通了) 希望高手精辟的指点下我的疑惑 弄懂指针的实质 展开
4个回答
展开全部
如果每道题都这么有趣,那天天看知道也不会无聊了。
这个题相当有趣。而且,几乎没有资料仔细的解释过这个问题。
正确的符合标准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];
这个题相当有趣。而且,几乎没有资料仔细的解释过这个问题。
正确的符合标准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];
展开全部
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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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型的处理机制问题,强制转换的副作用也是一个原因。
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型的处理机制问题,强制转换的副作用也是一个原因。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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的强制类型转换后的地址
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的强制类型转换后的地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询