NewKing 发表于 2013-11-6 15:05:35

一句费解的C代码

最近在研究一个项目的代码,发现其中有这么一句:

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

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

onepower 发表于 2013-11-6 15:09:30

强制转换成一个函数指针

techbaby 发表于 2013-11-6 15:12:38

(void (*)())   函数指针&UCA1TXBUF 地址
合起来就是将后面的地址强制转换为函数指针,然后赋值给左边变量。

onece 发表于 2013-11-6 15:24:01

楼上正解!!!

NewKing 发表于 2013-11-6 15:34:28

techbaby 发表于 2013-11-6 15:12 static/image/common/back.gif
(void (*)())   函数指针&UCA1TXBUF 地址
合起来就是将后面的地址强制转换为函数指针,然后赋值给左边变 ...

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

DMA0DA=(void *)&UCA1TXBUF;

techbaby 发表于 2013-11-6 15:39:09

如果DMA0DA是一个函数指针,那么赋值就要求是一个相同类型函数的地址,(void *)类型不匹配。

NewKing 发表于 2013-11-6 16:33:27

techbaby 发表于 2013-11-6 15:39 static/image/common/back.gif
如果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能否系统的说一下?

techbaby 发表于 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_FARPTRDMA0DA; 外部函数指针声明         
DMA0DA             = 0x0516;    --》对函数指针DMA0DA赋值,即DMA0DA指向地址0x0516

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

NewKing 发表于 2013-11-7 10:41:23

techbaby 发表于 2013-11-6 22:20 static/image/common/back.gif
高手不敢当。我也是一个学习者,指针这一块其实真的挺难懂。

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

好的,了解了,谢啦!

Gallen.Zhang 发表于 2013-11-7 11:39:21

将UCA1TXBUF的地址转换为参数为void,返回值为void的函数指针,并赋给DMAODA

NewKing 发表于 2013-11-11 16:12:11

Gallen.Zhang 发表于 2013-11-7 11:39 static/image/common/back.gif
将UCA1TXBUF的地址转换为参数为void,返回值为void的函数指针,并赋给DMAODA

多谢指点,Thanks!

lans0625 发表于 2013-11-11 16:18:34

学习了。。。{:smile:}

shin555 发表于 2013-11-13 16:41:39

学习了!                              

ljc2012 发表于 2013-11-20 22:56:11

techbaby 发表于 2013-11-6 22:20 static/image/common/back.gif
高手不敢当。我也是一个学习者,指针这一块其实真的挺难懂。

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

学习了!!
页: [1]
查看完整版本: 一句费解的C代码