指针强制类型转换


/*
1.强调对指针本质的理解
指针——存储空间的地址,对于不同的数据类型,指针指向的是存储该类型数据的连续空间的首地址
2.对指针强制类型转换的理解
1)任意类型的指针可以转换成void *;eg:int a[10]; void *p1=a;
2)将指针强制类型转换为TYPE之后,将会根据TYPE的实际存储,从首地址开始,取连续的n个;
比如,sizeof(TYPE)=4,那么,将从[p,p+3]作为它的存储空间
从下面的代码可以理解,l=(2^33)+1,实际上是l取了a[1]和a[0]的连续空间,并且a[1]在前面
这样就可以看出强制类型转换的危险:
本来 p=&a[0],*(int *)p=1,可是强制类型转换之后,*(long *)p=(2^33)+1
解决方法:
 */
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
using namespace std;
int a[10]={1,2,3,4,5,6,7,8,9,10};
void solve()
{
	cout<<"solve~~~~~~~~~~~~~~~~~~~~"<<endl;
	void *p=malloc(40);
	*(int *)p=a[0];
	long l=*(long *)p;
	cout<<"l= "<<l<<"  2^33= "<<(long )pow(2.0,33)<<endl;
}
void danger()
{
	cout<<"danger~~~~~~~~~~~~~~~~~~~~"<<endl;
	void *p=&a[0];
	long l=*(long *)p;
	cout<<"l= "<<l<<"  2^33= "<<(long )pow(2.0,33)<<endl;

}
int main()
{
	printf("long size=%d\n",sizeof(long));
	printf("int  size=%d\n",sizeof(int));
	danger();
	solve();
}

/*
 * 运行结果:
long size=8
int  size=4
danger~~~~~~~~~~~~~~~~~~~~
l= 8589934593  2^33= 8589934592
solve~~~~~~~~~~~~~~~~~~~~
l= 1  2^33= 8589934592
 */



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值