打印

请教关于指针类型转换,void指针

[复制链接]
2338|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
efen|  楼主 | 2012-11-25 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

u16 *ptr1;
u8   *ptr2;

*ptr1              = *(u16 *)ptr2 ; //语句1
*(u8 *)ptr1      = *ptr2 ;            //语句2
*(void **)ptr1  = ptr2 ;          //语句3
*(void *)ptr1      = *ptr2 ;        //语句4
为什么语句4不能通过编绎呢?而转为void指针类型只能用语句3,二级指针。
按我的理解语句4应该与语句2类似。用的EWARM编绎器

相关帖子

沙发
chenbb8| | 2012-11-25 20:07 | 只看该作者
请教大家一下 语句3是什么意思~
语句4错误的原因是,编译器不知道*ptr2这个值该给一个什么样的类型。
假设ptr1指向0x100,那么如果*ptr2里面的值要传给一个字节型的数据类型话,只需要修改地址0x100上的值。
如果*ptr2里面的值要传给一个双字节型的数据类型话,除了需要修改地址0x100上的值外还要修改0x101上的值……
因为这种不确定性,所以编译器报错
另外指针定义的时候最好要指向一个确定的地址

使用特权

评论回复
板凳
ayb_ice| | 2012-11-26 08:23 | 只看该作者
必须转换成具体的指针

使用特权

评论回复
地板
chenbb8| | 2012-11-26 12:14 | 只看该作者
刚才想了下,搞懂了第三句。
void **将ptr1强制转换成空类型的指向指针的指针,再用加上一个*就是指针的级别了,所以能接受ptr2的赋值

使用特权

评论回复
5
wjiujiu| | 2012-11-27 22:54 | 只看该作者
语句4:右边是u8型,左边无具体数据类型。可能会掉数据

使用特权

评论回复
6
sunhq02| | 2012-11-28 10:04 | 只看该作者
void* 只保存指针不保存类型
所以对void*解引用操作*(void *)ptr1, 是无意义的
因为编译器不知道如何解引用一个void*

第三句 void** 是指向void*的指针
解引用 *(void**) 得到 void*
而void*可以接受任何类型指针的赋值

使用特权

评论回复
7
efen|  楼主 | 2012-11-28 21:46 | 只看该作者
6# sunhq02
编译器不知道如何解引用一个void*   是什么意思?
这个“解引用”还是第一次听到。。
void *ptr1;
u8   *ptr2;
ptr1 = ptr2 ;

可否解释上述语句与 “译器不知道如何解引用一个void* ” 的区别

使用特权

评论回复
8
sunhq02| | 2013-10-22 13:21 | 只看该作者
"指针"是"引用"的一个特例
指针的逆操作, 取出指针中的东西, 称之为 解引用(dereference)

指针包括几个要素: 目标地址、目标类型、某些情况下还包括地址类型
要对指针解引用的话,编译器必须知道指针的目标类型
不然没法解引用

而你举的例子中, ptr2的目标类型是u8, ptr1没有目标类型或者说类型是void
所以那样做的效果实际上相当于强制类型转换
ptr1不可以解引用, ptr2可以

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:得之坦然,失之淡然,争其必然,顺其自然。

51

主题

616

帖子

1

粉丝