/*
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
*/