您的位置:首页 > 其它

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

2012-06-21 18:59 302 查看
看个例题
#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 *),其目的就是为了确保指针运算是以字节为单位
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: