史晓燕周建华:给结构体中的函数指针成员赋值

来源:百度文库 编辑:中财网 时间:2024/05/02 06:44:34
#includetypedef struct{int num;char * name;void(* sheild)(void);}player;void belle(void){printf("praise my lord\n");}int main(){player william;william.sheild = belle;【tag1】william.sheild();【tag1】----------------------------------------------*(void **)&william.sheild = belle;【tag2】william.sheild();【tag2】----------------------------------------------return 0;}结构体william中的成员sheild是一个函数指针,对于这个成员的赋值,我以前一直采用的是tag1方式,但是我今天看到了tag2的赋值方式,不知道作者的用意如何,为甚么要&一下,然后又强制转换(void **),又*一下呢,感觉这样好麻烦啊。

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

好问题~~*(void **)&william.sheild= belle 是先取william.sheild的地址,然后强制转为指向指针的指针,然后再对其赋值经过调试发现:*(void **)&william.sheild = belle;这种方式更为鲁棒可以试试将void(* sheild)(void);声明为不同类型。比如int(* sheild)(void);tag1的赋值方式将报错,而后者则可以通过所以作者的用意应该是:就算不知道所需函数的返回类型,也可以正确实现调用