C语言函数指针很纠结的问题,请达人解惑……
#include "stdio.h"
void putHello(void)
{
printf("Hello……\n\n");
}
void (*fun[])(void)={putHello,NULL};
void main()
{
int i;
void (**pptr1)(void);
void (*pptr2)(void);
for (pptr1=fun;*pptr1;pptr1++)
{
(*pptr1)();
(*(*pptr1))();
}
for (pptr2=*fun;pptr2;pptr2++)//这种写法出了问题
{
//主要是解决这个,编译正常,运行结果也出来了,但一显示完显示内存错误,为什么??
pptr();
(*pptr2)();
}
fun[0]();
(*fun[0])();
}
[解决办法]
如果想动态给函数指针数组分配内存的话,可以参考下面的代码:
- C/C++ code
typedef void (*PFUN) ();void print_hello1(){ printf("hello1\n");}void print_hello2(){ printf("hello2\n");}int main(int argc, char **argv){ //PFUN pfun[2]; //pfun[0] = print_hello1; //pfun[1] = print_hello2; PFUN* pfun = (PFUN*)malloc(2 * sizeof(PFUN)); *pfun = print_hello1; *(pfun + 1) = print_hello2; for(int i = 0; i < 2; ++i) { (*(pfun + i))(); }}
[解决办法]
[解决办法]
1、第一个循环:pptr1是指向函数指针的指针,对它赋值函数指针数组后fun[]后,可以通过++来遍历fun[],因为fun[]里面存储的是函数指针。
2、第二个循环:pptr2是函数指针,它本身指向函数的地址,直接对它++是(*fun)++,而不是*(fun++),其函数地址就错了。
所以你第二个循环的伪代码(从指针层级上来理解)应该是:for (pptr2=*fun;pptr2;(&pptr2)++)
用代码表示就是我5楼贴的代码那样。
[解决办法]
void (*fun[])(void)={putHello,NULL};
这个说白了就是一个数组fun,只是存储的内容是两个函数指针。
for (pptr2=*fun;pptr2;pptr2++)
那么lz的这句就没有道理了,fun是个数组名,*fun就是数组第一个元素的值,也就是函数指针putHello。然后lz要对一个函数指着++,这是要加到哪里去?
lz的pptr1我想是为了看函数指针的功能吧,记得前一阵子论坛里有一个帖子是谈论这个问题的。函数指针的值还是这个指针,也就是说对一个函数指针取值这个值也会是这个函数的地址,不管取值多少次都是一样的。
[解决办法]
万变不离其宗,无论有多少花哨的外套,抓住本质就好。
从lz的回复看,lz基本功不是很扎实,慢慢看清楚数组,指针,再去弄指针数组和数组指针,指针函数和函数指针这些玩意会比较好