C语言函数指针请教

2019-07-20 09:52发布

void (*Aa)();//定义一个函数指针Aa
void Bb(u8 A,u8 B)//自定义的函数Bb
{
A++;
B++;
}

void main(void)
{
Aa = (void(*)(u32))Bb;//这个地方的写法我不太明白
Aa(1,1);
while(1)
{}
}


问题内容:Aa是一个指针,应该给他赋值的是一个地址, (void(*)(u32))Bb是把Bb地址取出来吗?这里为什么不能写成&Bb?希望详细解释一下 (void(*)(u32))Bb这句的含义。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
wangmingwei093
1楼-- · 2019-07-20 13:04
刚看到这个的时候,我也一大堆疑问,刚用visio试了下,加上百度,总结了下:
先看看百度void*的用法:
void * 以定义一个指针变量,但不说明它指向哪一种类型数据.
1. 传参:通用类型
可以作为函数模板,链表等参数的通用参数。在使用时,只需要强制类型转换就可以。
2.强制类型转换
有时候由于重载等的干扰,导致需要转换成void *,来进行取地址。
例如,(void *)obj.member,就可以取到member的地址;直接&(obj.member)取到的实际上是obj的开始地址。
3.指向0的地址
(void *)0,指向全是0的地址,相当于NULL。
非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告。
这个回答应该可以解决了为什么要在前面加个void *吧,楼上争论的有没有必要加参数,刚做了下实验,在函数有返回值的时候,定义指针时必须加参数的,如果是void无返回类型的,就不用必须加了,所以楼主的楼上的说的都是对的,我的一个test,你们看下。[mw_shl_code=applescript,true]#include "stdafx.h"
#include <stdlib.h>
typedef unsigned int u32;

u32 test(u32 a, u32 b)
{
操作系统
2楼-- · 2019-07-20 13:26
Aa声明时,没有参数.但是Bb有两个参数.所以不能正确赋值.
会报错.
ysplm
3楼-- · 2019-07-20 17:04
 精彩回答 2  元偷偷看……
操作系统
4楼-- · 2019-07-20 17:36
本帖最后由 操作系统 于 2018-1-18 10:14 编辑
ysplm 发表于 2018-1-18 10:10
这个我测试过了,不会报错的,我也是一直这样用的。我是为了写一个独立的源码,需要调用其他C文件的函数 ...

希望详细解释一下 (void(*)(u32))Bb这句的含义。
你要解释这个呀.
Bb本身一个地址.又不是变量.Aa = (void(*)(u32))Bb;// 这个地方做了强制转换.不然是要报错的.
ysplm
5楼-- · 2019-07-20 20:36
 精彩回答 2  元偷偷看……
Arya
6楼-- · 2019-07-20 20:55
 精彩回答 2  元偷偷看……

一周热门 更多>