查看文章
 
深入理解C指针四(指针类型转换)
2008-10-14 15:52
---------------------------指针类型转换--------------------------------------LUPA开源社区%^ L8W X&d+?+o S z
没有隐式转化这一说,都要进行强转;LUPA开源社区 oV/u6D6@5d.N.w4g#U
如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP* 那么语法格式是: LUPA开源社区 O c u R a
  (TYPE*)p
,M c&M G u { C0  这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。
u w7p$@ b0P F N5x0  一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。
'A1` L/r$] k.l0    例7
D q y*] s | R$C0void fun(char*); LUPA开源社区 T z A y H |
int a=125, b;
T D f c t v e o0fun((char*)&a);
{ I t!i$T s N+F E;I0... LUPA开源社区-y A U @ Y#F P
... LUPA开源社区 O _5` { Y @ M!A2Y G
void fun(char *s) LUPA开源社区'u9N!w!R L
{
9S n;a o V3e r0char c; LUPA开源社区)s$S3T g u/I7i [
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c; LUPA开源社区6T!l X+E"s3`8U s1R
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c; LUPA开源社区$` i8I6t O ~
}
2h7D E o t0
z [/x.K$c ]0注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int。形参这个指针的类型是char*,它指向的类型是char。这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp 然后执行temp=(char*)&a,最后再把temp的值传递给s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。
])h `0r O @0[Note]编译器会自动用形参来转换指针的类型.
5F.l f I%R J ` C;F q0LUPA开源社区$~-E x:} e u-~-c
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:
P5z j(]2\ w ^.X |'l0  例8
+_6m T+V8` j0int a=123, b; LUPA开源社区 @ n y x S N)Z j*K `
int *ptr= &a;
| h(R D r5j%J/k h0M!C0char *str;
3A },s3D | y9y0b=(int)ptr;//把指针ptr的值当作一个整数取出来。 LUPA开源社区 N-B%j ^3a P(a
str=(char*)b;//把这个整数的值当作一个地址赋给指针str
_5\ ] a:h o,x v.y0现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。

类别:linux/c/c++||添加到搜藏 |分享到i贴吧|浏览(446)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu