C指针强制类型转换对所指向的数据的影响

  学习C指针过程中,受同学启发,思考了一个问题:如果对一个指针的类型进行强制转换(比如将一个指向整型的指针强制转换为指向字符的指针),那么这个指针指向的数据会发生什么样的变化呢?
  下面的代码实现了对指针类型的强制转换,并打印出了指针类型转换前后指针所指向的变量的值:
  

#include <stdio.h>

void main(void)
{
        int *p1;
        int num;
        char *p2;

        scanf("%d", &num);

        p1 = &num;
        p2 = (char*)p1;

        printf("%d\n", *p1);
        printf("%d", *p2);

}

分别输入3个整数,得到的结果分别是:

123
123

135
-121

871
103

下面试着分析一下出现这个结果的原因:

  1. 在C语言中声明整型和字符型变量时,默认它们都是有符号型变量。字符型变量本质上也是整型变量。字符型数据类型有8位,因此有符号字符型变量的取值范围是-127~127。而整型数据类型有16位,所以有符号整型的取值范围为-32767~32767.
  2. 对于整型值123,它也在字符型变量的取值范围内,所以当指向整型的指针强制转换为指向字符的指针时,对于指针指向的变量的值没有任何影响,所以输出123。
  3. 对于整型值135,由于此时超出了字符型变量的取值范围,所以指针在强制类型转换时,会对135的低位进行截取。135的二进制表达为10000111,截取低8位(因为字符型数据的位数为8),并将其认为是有符号数,所以整型值为-2^7+2^2+2+1=-121,因此输出-121。
  4. 同理对于整型值871,其也超出了字符型值的取值范围。871的二进制表达为1101100111,低8位为01100111,对应的有符号整型值为2^6+2^5+2^2+2+1=103。

      总结:对指针进行强制类型转换会影响指针所指向的变量的值,所以需要小心对待指针的强制类型转换这一操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值