您的位置:首页 > 其它

利用指针进行类型强制转换(c指针详解)

2014-12-16 10:56 106 查看


今天看《C指针详解》(好像也有叫《深入理解c指针》的)的时候,看到一个有关类型转换的例子。
例十六:

void fun(char*);
int a=125,b;
fun((char*)&a);
void fun(char*s)
{
char c;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}

第一眼看到这个例子的时候,我原本以为这个函数的功能是要将整型数字125进行倒置转换的,如125变作521,于是写了对历程进行了一下修改

#include <stdio.h>

void fun(char *s)
{
char c;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;

c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}

int main()
{
int a=125;
fun((char*)&a);
printf("a=%d\n",a);
return 0;
}

发现输出为:

2097152000
这跟我想的完全不一样,于是我仔细看了下解释,发现原文是这样写的:
”注意这是一个32 位程序,故int 类型占了四个字节,char 类型占一个字节。函数fun 的作用是把一个整数的四个字节的顺序来个颠倒。注意 到了吗?“

看到这里我大概明白这个函数的意思了,是利用指针在对寄存器里保存的变量的位进行处理。鉴于125这个数字化作二进制不太好处理,我将主程序第一行改为
int a=1;
因为我用的是32位系统,int类型占4个字节,那么在我的机器中1的机器数码形式应为
00000000 00000000 00000000 00000001
每个字节占8个比特位,函数fun对第1、4位,第2、3位进行了交换,那么交换之后a的保存形式变为
00000001 00000000 00000000 00000000
此时,printf之后,a的输出应为2^24(2的24次方),即
16777216
在VC中我验证了该结果




同理,int
a=2之后输出应为a=2^25=33554432



另外做为指针新手特别需要注意的是(见原文):
如果有一个指针p,我们需要把它的类型和所指向的类型改为
TYEP *TYPE, 那么语法格式是: (TYPE *)p; 这样强制类型转换的结果是一个新指针,该新指针的类型是 TYPE
*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。 而原来的指针p 的一切属性都没有被修改。(切记)

对应上述例子就是&a该指针(没有赋值给类似*a什么的指针,但是从指针的定义角度讲&a确实是指针,不要以为变量初始化阶段带*的才是指针。)经过函数fun的处理之后,&a的一切属性都没有被修改,即&a指向的地址中保存的a的值的属性仍然是int型而不是char型,所以在printf验证a输出的时候,仍热是%d形式输出而不是%s或者%c。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: