指针的强制转换

前面曾经讲过,如果指针变量指向的变量类型相同,两个指针变量可以互相赋值。如果指向的变量类型不同,可以先对指针进行类型强制转换。下面用一个具体的例子说明:
main()
{
long num=0xAAAABBBB, *pl=# /*num初始化为16进制数AAAABBBB*/
int *pn;
printf("\npl=%lX",*pl); /*%lX:以16进制方式输出一个long型数*/
pn=(int *)pl;
printf("\npn=%X", *pn);
pn++;
printf("\npn=%X", *pn);
}
程序运行的结果为:
pl=AAAABBBB
pn=BBBB
pn=AAAA

如图所示,long型变量num在内存占用4个字节,假设首地址为FFC0。因为整型数据在内存中存放的原则是低字节在前,高字节在后(参见汇编语言),所以FFC0开始的2个字节实际存放的是BBBB,FFC2开始的两个字节存放的是AAAA。初始化后,指针变量pl存放变量num的首地址,*pl的值就是变量num的值。
语句pn=(int *)pl;的作用是:将指针变量pl的类型进行强制转换,并将地址值赋给指针变量pn,赋值结束后,指针变量pn的值为pl保存的地址值FFC0。指针变量pn被定义为指向int型变量,因此系统取*pn的值时,读取从地址FFC0开始的2个字节,因此这时*pn的值为BBBB。
语句pn++;将指针变量pn自加1,根据指针加法的规则,pn被重新赋值为地址值FFC2,因此*pn的值为地址FFC2开始的2个字节的内存单元值,即AAAA。

你可能感兴趣的:(指针的强制转换)