c++中指针问题一个很好的例子

偶尔在问题区看到这个问题,感觉有助于对指针问题理解,所以记录一下,希望给看到的你一些帮助。代码如下:

#include  
using namespace std;
int main(){
	int a[2]={261,0};
	int *pi=a;
	char *p=(char *)pi;
	cout<<*(int*)p++<

输出为:

261
1
1
5

这个问题首先你要了解计算机的内存机制,计算机内存一般是按字节存储的(至少我们现在用的pc机都是这样),我们分析的时候经常数字转化为16进制进行分析,因为一位16进制正好是4bit,两位16进制就是一字节,261转化为16进制之后是105,如下:
c++中指针问题一个很好的例子_第1张图片
然后它在内存中的存储如果按照大端存储,就是下图这样的,我们用的pc机大多是按照大端存储的,就是低字节存在内存的低地址,小端存储相反,不清楚的话自己百度一下:
c++中指针问题一个很好的例子_第2张图片

cout<<*(int*)p++<

解释:p指针转化为int型指针,并取内容,也就是说,从p指针指向的地方开始,取int长度个字节,也就是4字节,所以取出来的是00,00,01,05,也就是261的16进制,输出时按照10进制输出的,所以是261

cout<<*(int*)p<

和上一步一样,只是上一步p已经后置自增,所以现在p指向01,所以取出来是00,00,00,01,也就是1的16进制表示(与其十进制表示一样),所以输出1。

cout<<(int)*p<

这一步是将p指向的内容取出来,记住p是一个char型指针,一直都没有改变,所以只取一个字节,也就是01,(int)部分是将它扩展为4字节,这采用的应该是符号扩展(这是数字逻辑或计算机组成原理的知识,不清楚请自行百度),因为是正数,所以前面添0就行,扩展之后是00,00,00,01,和上一步一样,输出1。

cout<<(int)*(char*)pi<

这一步看着很绕,其实都是纸老虎,首先pi是一个int型指针,指向的是05,先将它转外为char型指针并取其内容,也就是只取一个字节内容,就是05,然后将其转化为int型的值,也是符号扩展,前面加0,扩展之后是00,00,00,05,再将这16进制转化为十进制,就是5。

需要注意的是,指针操作,类型转换操作,应该考虑操作的优先级,这四个转化中,都是自后向前的。

你可能感兴趣的:(C++)