打印

请教C语言语法问题

[复制链接]
2929|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuidi_wangdan|  楼主 | 2013-5-16 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义下面几个函数:
uint table1[10]=0;
uint table2[3][3]=0;
void t1()
{
.....
}
void t2()
{
.....
}
void t_load(uint fn,uchar x)
{
  table[x]=table2[x]+1;
  table2[x][0]=(uint)fn&0xff;
  table2[x][1]=(uint)fn>>8;
}
void main()
{
   t_load(t1, 1);
   t_load(t2, 1);
}
为什么t_load(t1, 1); 可以直接调用函数,这段函数后边的注释说:是把函数t1的地址付给了数组table2了。请老师指点!!
沙发
huangxz| | 2013-5-16 10:47 | 只看该作者
楼主你这个用啥编译器,可以编译的过么?

使用特权

评论回复
板凳
shuidi_wangdan|  楼主 | 2013-5-16 10:49 | 只看该作者
可以编译的过,我也很奇怪,以前没用过,这里应该是指针,为什么是变量不得其解,

使用特权

评论回复
地板
huangxz| | 2013-5-16 10:52 | 只看该作者
shuidi_wangdan 发表于 2013-5-16 10:49
可以编译的过,我也很奇怪,以前没用过,这里应该是指针,为什么是变量不得其解, ...

啥编译器?

使用特权

评论回复
5
shuidi_wangdan|  楼主 | 2013-5-16 10:53 | 只看该作者
huangxz 发表于 2013-5-16 10:52
啥编译器?

就是keil的,

使用特权

评论回复
6
huangxz| | 2013-5-16 10:53 | 只看该作者
keil 能编译pic程序:L

使用特权

评论回复
7
shuidi_wangdan|  楼主 | 2013-5-16 10:54 | 只看该作者
huangxz 发表于 2013-5-16 10:53
keil 能编译pic程序

不是,我只是想探讨一下这个语法,为什么可以这样用?

使用特权

评论回复
8
huangxz| | 2013-5-16 10:57 | 只看该作者
;P以我的认知,就知道能指针传递,这个太深了,你要@到大虾那里去才可以啊

使用特权

评论回复
9
shuidi_wangdan|  楼主 | 2013-5-16 11:03 | 只看该作者
huangxz 发表于 2013-5-16 10:57
以我的认知,就知道能指针传递,这个太深了,你要@到大虾那里去才可以啊 ...

我不会@,我也希望大家讨论一下,以后大家都知道了,也学习了!

使用特权

评论回复
10
huangxz| | 2013-5-16 11:07 | 只看该作者
shuidi_wangdan 发表于 2013-5-16 11:03
我不会@,我也希望大家讨论一下,以后大家都知道了,也学习了!

那你把工程附出来拉,让大家来编译下看看,实在是不可思议

使用特权

评论回复
11
ayb_ice| | 2013-5-16 11:34 | 只看该作者
隐含的自动转换

使用特权

评论回复
12
shuidi_wangdan|  楼主 | 2013-5-16 11:42 | 只看该作者
huangxz 发表于 2013-5-16 11:07
那你把工程附出来拉,让大家来编译下看看,实在是不可思议

我再发一个帖子吧,把所有的文件都传上来。

使用特权

评论回复
13
shuidi_wangdan|  楼主 | 2013-5-16 11:42 | 只看该作者
ayb_ice 发表于 2013-5-16 11:34
隐含的自动转换

老师,您能细讲一下吗?

使用特权

评论回复
14
爱就一个字| | 2013-5-16 12:15 | 只看该作者
C语言中,函数名表示函数代码在内存中的起始地址,执行t_load(t1, 1)之后,将函数t1的起始地址作为形参传递给t_load函数
个人见解,仅供参考

使用特权

评论回复
15
huangxz| | 2013-5-16 13:16 | 只看该作者
ayb_ice 发表于 2013-5-16 11:34
隐含的自动转换

这个应该不是c语言里面的内容,我用gcc是编译不过的

使用特权

评论回复
16
zh_sl| | 2013-5-16 14:57 | 只看该作者
本帖最后由 zh_sl 于 2013-5-16 15:03 编辑

如果是t_load((uint)t1, 1);就能理解

============================

table2[][]是uint类,t_load里的fn也是uint类,不明白为什么要分开存

使用特权

评论回复
17
天下无痕| | 2013-5-16 15:09 | 只看该作者
楼主去看看数组函数这一节估计就能明白吧,这个不是一句话两句话就能说清楚的。
希望你吧uint这个定义也上来

使用特权

评论回复
18
shuidi_wangdan|  楼主 | 2013-5-16 15:43 | 只看该作者
zh_sl 发表于 2013-5-16 14:57
如果是t_load((uint)t1, 1);就能理解

============================

为了读取函数的高地址和低地址

使用特权

评论回复
19
shuidi_wangdan|  楼主 | 2013-5-16 15:44 | 只看该作者
天下无痕 发表于 2013-5-16 15:09
楼主去看看数组函数这一节估计就能明白吧,这个不是一句话两句话就能说清楚的。
希望你吧uint这个定义也上 ...

#define unsiged int uint定义的是字

使用特权

评论回复
20
liub_2014| | 2013-5-16 21:31 | 只看该作者
void t_load(uint fn,uchar x)  中fn他数定义为整型, 在调用时 t1 t2 的类型为函数指针(函数的起地址);
在这里两个数据的类型是不一样的,但他们在内存中的值都一样用二进制编码的,所以从内存或底层来说(对硬件)两种类型都表示数值, 所以t_load 中 传的是 t1 的数值(这里不当作地址处理, 但他们的值是一样的);
那为什么有的编译器里不能通过呢,那是由于一般的数据类型和指针类型在内存的存储区域不同,而且系统对指针有特殊的管理,所以在编译器中可以检测出t1 t2 的类型, 当编译器对不同的类型不能做参数传递时会报错或警告,但并不是所有的编译器都这样做的!

使用特权

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

本版积分规则

个人签名:奇葩满天下,不分你我他! 奋斗!https://bbs.21ic.com/static/image/smiley/chubby/17.gif[/url]

65

主题

549

帖子

3

粉丝