函数指针:
定义:typedef void (F1)(int p1, int p2)
typedef void (*F2)(int p1, int p2)
test (int p1, int p2);
F1 * fp1;
F2 fp2;
F1 fp3;
问: 语句
fp3 = test;
fp2 = test;
fp1 = test
是否成立?
答案:第一条语句有错,其余两条语句正确。
typedef void (F1)(int p1, int p2) 是什么意思??
>> 本文固定链接: http://www.vcgood.com/archives/1022
>> 转载请注明: peterzhu_1 2006年08月30日 于 C语言帝国 发表
自己解释下:
typedef 可以用来声明新的类型名来代替已有的类型:
typedef void (F1)(int p1, int p2) 就是说:
F1是这样一种类型:它是一个无返回值的函数类型
F1 * fp1,fp1是一个指向函数的指针变量,所以fp1=test是正确的
而F1 fp3,fp3是一个无返回值的普通函数,故fp3=test是错误的
不会吧,明明是fp3 = test;对,而后两句错呀,你是不是看错了?
函数指针的问题:
函数是有地址的,函数名就是函数的地址(函数指针).
//先看F2的定义
typedef void (*F2)(int p1, int p2); // 首先F2是一个函数指针类型,指向的是带两个int型参数的函数,返回类型是void型的.
F2 fp2; // 定义一个变量,类型是F2函数指针类型的
fp2 = test; // 指向函数
//类似的F1
typedef void (F1)(int p1, int p2); // F1是个函数类型,带两个int型参数的函数,返回类型是void型的.
F1 *fp1; // 定义一个指针变量.类型是F1函数类型.
fp1 = test; // 指向函数
//fp3不是指针类型的变量,所以把函数地址赋值给他的时候是错误的.
F1 fp3;
fp3 = test;
当然如果写成如下的形式就正确了!
F1 &fp3 = test; // fp3是test的引用
其实typedef void (F1)(int p1, int p2);和typedef void (*F2)(int p1, int p2);原理等同于下面的.
typedef int * PINT;
typedef int INT;
PINT pInt;
INT *pInt;
还有注意的是void (*F2)(int p1, int p2)中第一个括号不能省略.否则变成这样
void *F2(int p1, int p2)就是定义一个函数了.
版主解释得太好了,真厉害啊!!