搜索
bottom↓
回复: 13

一句费解的C代码

[复制链接]

出0入0汤圆

发表于 2013-11-6 15:05:35 | 显示全部楼层 |阅读模式
最近在研究一个项目的代码,发现其中有这么一句:

DMA0DA=(void (*)())&UCA1TXBUF;

什么意思?大神们帮帮忙!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-11-6 15:09:30 | 显示全部楼层
强制转换成一个函数指针

出20入70汤圆

发表于 2013-11-6 15:12:38 | 显示全部楼层
(void (*)())   函数指针  &UCA1TXBUF 地址
合起来就是将后面的地址强制转换为函数指针,然后赋值给左边变量。

出0入21汤圆

发表于 2013-11-6 15:24:01 | 显示全部楼层
楼上正解!!!

出0入0汤圆

 楼主| 发表于 2013-11-6 15:34:28 | 显示全部楼层
techbaby 发表于 2013-11-6 15:12
(void (*)())   函数指针  &UCA1TXBUF 地址
合起来就是将后面的地址强制转换为函数指针,然后赋值给左边变 ...

谢谢指点。
但是,为什么要转换为函数指针,直接转换成指针不行吗,像这样:

DMA0DA=(void *)&UCA1TXBUF;

出20入70汤圆

发表于 2013-11-6 15:39:09 | 显示全部楼层
如果DMA0DA是一个函数指针,那么赋值就要求是一个相同类型函数的地址,(void *)类型不匹配。

出0入0汤圆

 楼主| 发表于 2013-11-6 16:33:27 | 显示全部楼层
techbaby 发表于 2013-11-6 15:39
如果DMA0DA是一个函数指针,那么赋值就要求是一个相同类型函数的地址,(void *)类型不匹配。 ...

真是高手,多谢指点!

刚才看了一下相关代码定义,发现如下:

typedef void (* __SFR_FARPTR)();
#define SFR_20BIT(address) extern __SFR_FARPTR address

SFR_20BIT(DMA0DA);                            /* DMA Channel 0 Destination Address */

DMA0DA             = 0x0516;

高手techbaby能否系统的说一下?

出20入70汤圆

发表于 2013-11-6 22:20:13 | 显示全部楼层
高手不敢当。我也是一个学习者,指针这一块其实真的挺难懂。

typedef void (* __SFR_FARPTR)();   --》 类型定义,定义新函数指针类型__SFR_FARPTR
#define SFR_20BIT(address) extern __SFR_FARPTR address --》
SFR_20BIT(DMA0DA);  --》展开 extern __SFR_FARPTR  DMA0DA; 外部函数指针声明         
DMA0DA             = 0x0516;    --》对函数指针DMA0DA赋值,即DMA0DA指向地址0x0516

其实对指针赋值,就是将地址传给指针,同时地址也就是一个数值。(不知道理解的对不对,还望指正)。

出0入0汤圆

 楼主| 发表于 2013-11-7 10:41:23 | 显示全部楼层
techbaby 发表于 2013-11-6 22:20
高手不敢当。我也是一个学习者,指针这一块其实真的挺难懂。

typedef void (* __SFR_FARPTR)();   --》 类 ...

好的,了解了,谢啦!

出0入0汤圆

发表于 2013-11-7 11:39:21 | 显示全部楼层
将UCA1TXBUF的地址转换为参数为void,返回值为void的函数指针,并赋给DMAODA

出0入0汤圆

 楼主| 发表于 2013-11-11 16:12:11 | 显示全部楼层
Gallen.Zhang 发表于 2013-11-7 11:39
将UCA1TXBUF的地址转换为参数为void,返回值为void的函数指针,并赋给DMAODA

多谢指点,Thanks!

出0入0汤圆

发表于 2013-11-11 16:18:34 | 显示全部楼层
学习了。。。

出0入0汤圆

发表于 2013-11-13 16:41:39 | 显示全部楼层
学习了!                              

出0入0汤圆

发表于 2013-11-20 22:56:11 | 显示全部楼层
techbaby 发表于 2013-11-6 22:20
高手不敢当。我也是一个学习者,指针这一块其实真的挺难懂。

typedef void (* __SFR_FARPTR)();   --》 类 ...

学习了!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 07:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表