细节问题系列之指针类型强制转换

原创 2015年11月19日 23:54:41

题目:

unsigned int nValue = 0x5D6C7B3E;
printf("%c", *((unsigned char *)(&nValue) + 2) + 2);

变形1:

unsigned int nValue = 0x5D6C7B3E;
printf("%X", *((unsigned char *)(&nValue) + 2) + 2);

变形2:

unsigned int nValue = 0x5D6C7B3E;
printf("%d", *((unsigned char *)(&nValue) + 2) + 2);

分析

  1. 咱们先看原题目,本题不考虑编译器位数的影响,一般32位编译器和64位编译器对于int的实现相同,长度均为4个字节,16位编译器不在考虑范围,另外本题目也不考虑字节序的影响,采用最通用的环境intel小端字节序,即高位存储在高地址,地位存储在低地址,说明了这些下面我们来分析题目本身的考点。

  2. 这道题目的关键在于指针类型的强制转换,我们来一步一步分析,(&nValue)是取无符号整形变量nValue的地址,其类型默认为(unsigned int *),但是前面有强制类型转换,(unsigned char *)表示将一个指针转换成无符号字符型的指针,由于指针的类型发生了变化,因此指针的++运算从原来每次地址+4变成了每次地址+1,那么((unsigned char *)(&nValue) + 2)就是表示从首地址向后加2个字节,假设unsigned char *ptr = (unsigned char *)(&nValue),则((unsigned char *)(&nValue) + 2)即为ptr+2,其中*ptr的内容为0x3E, *(ptr+2)的内容就为0x6C,也就是*((unsigned char *)(&nValue) + 2)的值为0x6C,最后还有+2,也就是最后表达式的值为0x6E。

  3. 本题目的另一个考点就是输出格式,原题目中%c是以字符输出,0x6E转换成10进制是110,ji字母n的ASCII码,变形1中%X是以16进制输出,其中的字母用大写表示,与之相对的是%x字母用小写表示,变形2中就是以整数输出,也就是110了

  4. 三道题的输出结果分别为n、6E、110

版权声明:本文为博主原创文章,转载请注明出处。更多精彩文章请关注微信公众号:写代码的苏东坡

相关文章推荐

深入理解指针类型间的转换

当我们初始化一个指针或给一个指针赋值时,赋值号(=)的左边是一个指针,赋值号(=)的右边是一个指针表达式,在绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类...

C++中指针的强制转换。

一、指针地址的本质和存储      在C++中所有的指针地址的大小都是固定的,也就都是4个字节的大小,地址的本质就是一串0和1的机器代码。任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码...

C语言指针强制类型转换

int a = 1; int *p = &a; float *p1 = (float*)p; 则p和p1的值都是&a,但是*p是将&a地址中的值按照int型变量进行解释,而*p1则是...

指针的强制类型转换和动态分配内存

C里面使用自动分配内存,比如说malloc分配自由存取区,就把它当作是在堆上分配的了, 他的好处是可分配的内存更大更灵活,理论上可以分配用户空间能使用的所有虚拟内存空间, 它是通过链式分配的,比如...

C语言指针强制类型转换

概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供...
  • mhjcumt
  • mhjcumt
  • 2012年06月28日 22:47
  • 73314

【Object-C】指针变量强制类型转换

除了id类型外,指针变量只能调用它编译时类型的方法。而不能调用它运行时类型的方法,即使它实际所指向的对象包含该方法。如果需要让这个指针变量调用运行时类型的方法,就需要强制类型转换。 #import ...

指针和指针强制转换( 回忆版 )-------让初学者理解

什么是指针: 首先我们需要知道指针是什么,说白了,就是地址(一般我不讲指针,因为一个新的名词突然出现太难以理解 ),那么为什么又分成int*, float*…,之类呢? 我们可以测试,在win...

指针强制转换问题

(强制):如果指针所指向的类型带有const  或volatile               限定符,那么移除限定符 的强制转换是不允许的。  (11.5 A cast shall not be p...

C语言:指针类型强制性转换

C语言:指针类型强制性转换标签:C语言 指针 强制性转换by 小威威1.引入我们知道,每个变量都有对应的地址,地址的距离即为地址之差。然而,地址类型不同,也就不能进行减法运算。假如,我现在要求doub...
  • linwh8
  • linwh8
  • 2015年12月17日 20:35
  • 573

将指针强制类型转换为函数指针

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数地址的方法是:用不带有括号和参数的函数名得到。 函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:细节问题系列之指针类型强制转换
举报原因:
原因补充:

(最多只允许输入30个字)