打印

C51中的结构体里面的元素能是函数吗

[复制链接]
5106|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
darlin520|  楼主 | 2012-9-25 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C51中的结构体里面的元素能是函数吗,如果是函数能是指针型函数吗,最近看到了这样的结构体,比较疑惑,望前辈指教。比如说:
typedef data struct
   {
   void (code * pTask)(void);  
   tWord Delay;      
   tWord Period;      
   tByte RunMe;      
   } sTask;
这个结构体里的指针函数为什么不能带返回值,为什么要用code而不用其它的如int或char,而且为什么不能带形参呢???

相关帖子

沙发
znmcu| | 2012-9-25 12:36 | 只看该作者
没有问题。

使用特权

评论回复
板凳
znmcu| | 2012-9-25 12:37 | 只看该作者
当然可以带形参,也可以有返回值。函数指针

使用特权

评论回复
地板
znmcu| | 2012-9-25 12:45 | 只看该作者
指针历来是C语言的难点,也是学习者最大的拦路虎,更深层的指针应用,如函数指针、指针强转等等,更是让很多学习者难以接受。其实指针就是一通百通。我给人讲指针,最常说的一句话就是“指针就是有类型的地址”。
函数指针,指向某一种形式的函数的入口地址。

int fun1(int a,int b)
我们想要用一个指针来指向fun1,从而通过指针间接的调用函数。可以这样定义
int (*pfun)(int a,int b)

pfun就是地址,外层的修饰就是在描述它的类型。

如果你能深入理解我所说的,你也就理解了指针的真谛。

使用特权

评论回复
5
原野之狼| | 2012-9-25 12:52 | 只看该作者
在语法上,void 对应与  int 、 char  
code 跟  int 、 char 可不是相同的语义

使用特权

评论回复
6
znmcu| | 2012-9-25 12:52 | 只看该作者
指针的定义,可以使用“替换法”:
比如 int a; 要定义一个指向a的指针,我们就把 a替换为 *p,即 int *p;

比如 struct _STRU a; 就是 struct _STRU *p;

比如 int fun1(int a,int b); 要定义一个指针指向此函数,把fun1替换为*p,即 int (*p)(int a,int b);

你想定义可以指向某种数据类型,结构或函数,我称之为一种形式,那你在常规定义中的 变量名、函数名等换为 *p,那p就可以指向具有这种“形式”的“对象”了。

使用特权

评论回复
7
原野之狼| | 2012-9-25 13:20 | 只看该作者
多看教材  多看源码  多使用  就会有感觉的 要不然靠**是痛苦的

使用特权

评论回复
8
znmcu| | 2012-9-25 13:33 | 只看该作者
指针就是 “有类型的地址”

我们可以给定一个地址 0X0010,我们要让CPU从这个地址

上取数,问题是取几个字节,如何由这些字节算得数值,

因此,我们还要给出以这个地址开始字节长度,如果告诉

CPU,我们可以这样

4BYTES a _at_ 或 @ 0X0010; //伪代码

好,这样CPU就知道从0X0010这个地址开始取出4个字节,

a用于记载这4个字节计算所得到的值。
这取出的4个字节,如何计算?也许你会说,它可以是一

个long型。这4个字节拼在一起,确实可以表示一个
长整形数。那它为什么就不能表示一个float呢?为什么

不能表示一个有4个char元素的数组呢?为什么不能表示

一个有2个int元素的数据组呢?为什么不能表示有两个

char,和一个int的结构体变量呢?为什么不能表示有32

个位的位域结构呢?.................... 这4个字节能

够表达的意义太多了。CPU根本不知道如何由这4个字节计

算它所表达的值。为什么?因为我们只告诉CPU取出4个字

节,却并没有告诉这4个字节的具体“类型”,如此,我

们把上面的定义补充一下

UINT32 a _at_ 或 @ 0X0010; //伪代码

这样,CPU就知道把0X0010地址开始的4个字节取出,并视

之为长整型。最终的结果是一个整数。

如果是
FLOAT32 a _at_ 或 @ 0X0010; //伪代码

那CPU就把这4个字节取出,视之为单精浮点,按阶码、尾

码的计算方法计算,最终得到一个小数数值。

因此,“指针”就是有“类型”的地址。地址告诉CPU到

哪里取数,“类型”告诉CPU取多少数据,以及计算方式



我们理解到这种层面之后,关于指针的一切操作都会流畅

而灵活。我们用真正的C语言代码来说明一些问题:
float f=2.34;
unsigned char *pf=(unsigned char *)(&f);
printf("%x",pf[2]);

上面的程序其实是在说明 “指针类型强转”。pf是一个

指向uchar,即一个字节的指针;&f是float变量f的地址

,即指向float的指针。它们所表达的地址其实是同一个

地址,不同的是“类型”不同,即取的字节数不同,数值

计算方式也不同。最后pf[2]就可以取出f变量的第2个字

节。同理,我们这样
unsigned char a[10];
unsigned int *pb=(unsigned int *)a;

我们通过pb去访问数组,每次我们得到的就是一个 uint



深入理解 “指针就是有类型的地址”,将使你可以灵活

和准确的运用指针。抓住了指针,你才算真正拿下了C语

言!!!

使用特权

评论回复
9
ayb_ice| | 2012-9-25 14:34 | 只看该作者
是指针,不是函数

使用特权

评论回复
10
misra| | 2012-9-25 18:11 | 只看该作者
能。 函数名说白了就是个地址。 和普通变量的地址没啥区别的。 就是个数。

使用特权

评论回复
11
misra| | 2012-9-25 18:13 | 只看该作者
结构体说白了 就是个类型名。 就和 unsigned char 一样的,没啥区别。

使用特权

评论回复
12
Wayner| | 2012-9-25 20:24 | 只看该作者
谢谢!受教了

使用特权

评论回复
13
darlin520|  楼主 | 2012-9-25 22:18 | 只看该作者
谢谢各位高手的回答,但好像大侠们都没有回答到要点上,我就是看别人的原码看不懂了才来求教的,我最主要想问的是结构体的元素可以是函数吗,因为我以前听说C++才能用而C的结构体里是不能带函数的。。还请大侠指点。

使用特权

评论回复
14
darlin520|  楼主 | 2012-9-25 22:22 | 只看该作者
可能是我理解错误了,里面的 void (code * pTask)(void)难道不是声明一个指向函数的指针吗,不有为什么是code类型,难道是为了节省内存吗

使用特权

评论回复
15
airwill| | 2012-9-25 23:20 | 只看该作者
为什么是code类型?
这是个指针, 既然是函数, 那么就一定是在 CODE 区, 所以这个指针就应该是 CODE 存储类型.
结构体虽然可以包含函数, 但是毕竟不是类.

使用特权

评论回复
16
ayb_ice| | 2012-9-26 08:27 | 只看该作者
首先是函数指针,和函数有明显区别

C++的类和结构体中可以包括函数,C不行

其次是指向code区,而不是放在ocde区,函数本身是在code区,指向code区后,指针的运算效率高些

使用特权

评论回复
17
w522930954| | 2012-9-26 09:49 | 只看该作者
不是指针函数,是函数指针。明白这个概念这个问题就解决了。

使用特权

评论回复
18
szseo668| | 2012-9-26 10:13 | 只看该作者
看到这些代码已经很陌生了。

使用特权

评论回复
19
kangwuwei| | 2012-9-26 11:17 | 只看该作者
C的结构体中只可以包含指针。
加上code应该是指明这个指针只能指向ROM区也就是代码区,如果不加的话 可以把RAM区的数据做强制类型转化,让它指向RAM区,加上了保险而已,可以去掉。

使用特权

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

本版积分规则

0

主题

107

帖子

0

粉丝