现在的位置: 首页 > 综合 > 正文

区别指针类型与所指对象的类型

2012年10月22日 ⁄ 综合 ⁄ 共 616字 ⁄ 字号 评论关闭

        看个例题

#include <stdio.h>

int
main()
{
    unsigned int a = 0xfffffff7;
    char *b = (char *)&a;
    printf("%08x\n", *b);
    return 0;
}

        强制用一个char *类型的指针指向对象a,一般我们认为其代表的含义是:当通过指针b来访问对象a时,把对象a当成char类型的对象。

        不幸的是,这个例子展示了这种习惯思维并不总是对的,运行结果为fffffff7.

        像这种反常规思维的用法不属于良好的编程风格,应该极力避免。这个例子出自《程序员面试宝典》第二版5.4节例题3,中国某著名通信企业S公司2007年8月面试题。很多情况下中国的考试本质是为了淘汰,所以各种坑爹的题目也屡见不鲜了。不管怎样,运行结果就是这样。

        这个例子比较积极的一面,在于提醒我们区分指针的类型和所指对象的类型。将一个unsigned int *类型的地址强制转化为一个char *类型的指针,导致的结果是对指针的运算产生影响:

unsigned int p;
unsigned int *a = &p;
char * b = (char *)&p;
a + 1表示p的地址加上1*sizeof(unsigned int)
b + 1表示p的地址加上1*sizeof(char)

        在一些大牛写的代码中(比如linux kernel),经常遇到将指针强制类型转化为(char *),其目的就是为了确保指针运算是以字节为单位

抱歉!评论已关闭.