学习C指针过程中,受同学启发,思考了一个问题:如果对一个指针的类型进行强制转换(比如将一个指向整型的指针强制转换为指向字符的指针),那么这个指针指向的数据会发生什么样的变化呢?
下面的代码实现了对指针类型的强制转换,并打印出了指针类型转换前后指针所指向的变量的值:
#include <stdio.h>
void main(void)
{
int *p1;
int num;
char *p2;
scanf("%d", &num);
p1 = #
p2 = (char*)p1;
printf("%d\n", *p1);
printf("%d", *p2);
}
分别输入3个整数,得到的结果分别是:
123
123
135
-121
871
103
下面试着分析一下出现这个结果的原因:
- 在C语言中声明整型和字符型变量时,默认它们都是有符号型变量。字符型变量本质上也是整型变量。字符型数据类型有8位,因此有符号字符型变量的取值范围是-127~127。而整型数据类型有16位,所以有符号整型的取值范围为-32767~32767.
- 对于整型值123,它也在字符型变量的取值范围内,所以当指向整型的指针强制转换为指向字符的指针时,对于指针指向的变量的值没有任何影响,所以输出123。
- 对于整型值135,由于此时超出了字符型变量的取值范围,所以指针在强制类型转换时,会对135的低位进行截取。135的二进制表达为10000111,截取低8位(因为字符型数据的位数为8),并将其认为是有符号数,所以整型值为-2^7+2^2+2+1=-121,因此输出-121。
同理对于整型值871,其也超出了字符型值的取值范围。871的二进制表达为1101100111,低8位为01100111,对应的有符号整型值为2^6+2^5+2^2+2+1=103。
总结:对指针进行强制类型转换会影响指针所指向的变量的值,所以需要小心对待指针的强制类型转换这一操作。