读书人

C语言函数指针很纠结的有关问题请达

发布时间: 2012-04-23 13:17:38 作者: rapoo

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))();    }}
[解决办法]
探讨for (pptr2=*fun;pptr2;pptr2++)//这种写法出了问题
{
//主要是解决这个,编译正常,运行结果也出来了,但一显示完显示内存错误,为什么??
这里你可以添加一条语句,printf("pptr2=%p\n", pptr2); 看看pttr2的值,然后理解一下void类型的point进行++运算的时候是怎么回事,还有,地址对齐取数的问题.
pptr();
(*pptr2)();
}

[解决办法]
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基本功不是很扎实,慢慢看清楚数组,指针,再去弄指针数组和数组指针,指针函数和函数指针这些玩意会比较好

读书人网 >C语言

热点推荐