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

 

 今天看《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。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值