关于函数作为参数的问题

点金胜手秋离 2009-06-25 08:53:09
#include<stdio.h>
#include<stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}*bitree,bitnode;

typedef struct
{
bitree *base;
bitree *top;
int stacksize;
}sqstack;


int initstack(sqstack &s)
{
s.base=(bitree *)malloc(STACK_INIT_SIZE *sizeof(bitree));
if(!s.base)
exit(0);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 1;
}

int gettop(sqstack s,bitree &e)
{
if(s.top==s.base)
return 0;
e=*(s.top-1);
return 1;
}

int push(sqstack &s,bitree e)
{
if(s.top-s.base==s.stacksize)
{
s.base=(bitree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return 1;
}

int pop(sqstack &s,bitree &e)
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}

int stackempty(sqstack s)
{
if(s.top-s.base==0)
return 1;
else return 0;
}

int createbitree(bitree &t)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
t=0;
else
{
if(!(t=(bitnode *)malloc(sizeof(bitnode))))
exit(0);
t->data=ch;
createbitree(t->lchild);
createbitree(t->rchild);
}
return 1;
}

int visit(char e)
{
if(e!=NULL)
{
printf("E is:%c",e);
printf("\n");
return e;
}
else return 0;
}

int inordertraverse(bitree t,int (* visit)(char e))//此处参数的问题
{
sqstack s;
bitree p;
initstack(s);
push(s,t);
while(!stackempty(s))
{
while(gettop(s,p)&&p)
push(s,p->lchild);
pop(s,p);
if(!stackempty(s))
{
pop(s,p);
if(!visit(p->data))
return 0;
push(s,p->rchild);
}
}
return 1;
}

void main(void)
{

bitree t;
char e;
int p;
e=e;
p=p;
int (* q)(char);
q=visit;
createbitree(t);
inordertraverse(t, *q);
}


在int inordertraverse(bitree t,int (* visit)(char e))处,如果去掉visit前的*,变成int inordertraverse(bitree t,int visit(char e)),编译也没有错误,一个是指向函数的指针,一个是函数作为参数,结果为什么都一样?反汇编以后汇编代码一样,希望高手指点指点!































...全文
43 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
点金胜手秋离 2009-07-04
  • 打赏
  • 举报
回复
谢谢,指点了
brookmill 2009-06-30
  • 打赏
  • 举报
回复
以下摘自: http://blog.csdn.net/norbe/archive/2006/03/14/624257.aspx

函数指针变量
  在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址 ( 或称入口地址 ) 赋予一个指针变量, 使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。 我们把这种指向函数的指针变量称为 " 函数指针变量 " 。
点金胜手秋离 2009-06-30
  • 打赏
  • 举报
回复
二楼能给出详细的解释吗,谢谢!
点金胜手秋离 2009-06-30
  • 打赏
  • 举报
回复
谢谢各位了,我的那个程序,不用改就可以调试通过的
在int inordertraverse(bitree t,int (* visit)(char e))处,如果去掉visit前的*,变成int inordertraverse(bitree t,int visit(char e)),编译也没有错误,一个是指向函数的指针,一个是函数作为参数,结果为什么都一样?反汇编以后汇编代码一样,
但是上面的参数传递明显不同,由于两个变量没有使用,所以会有warning,就是参数传递不理解,希望各位高手帮忙解答
foxfoxes 2009-06-26
  • 打赏
  • 举报
回复
学习了。
ljhhh0123 2009-06-26
  • 打赏
  • 举报
回复
2楼正解。在老的编译器上可能会有警告,在新的编译器中是标准。
brookmill 2009-06-25
  • 打赏
  • 举报
回复
对编译器来说,函数名就是一个地址。
所以很多时候,函数名和函数指针是可以通用的。
mengjfu 2009-06-25
  • 打赏
  • 举报
回复
参数传递的问题吧
#include <stdio.h> 
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int (* FUN)(char);

typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}*bitree,bitnode;

typedef struct
{
bitree *base;
bitree *top;
int stacksize;
}sqstack;


int initstack(sqstack &s)
{
s.base=(bitree *)malloc(STACK_INIT_SIZE *sizeof(bitree));
if(!s.base)
exit(0);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 1;
}

int gettop(sqstack s,bitree &e)
{
if(s.top==s.base)
return 0;
e=*(s.top-1);
return 1;
}

int push(sqstack &s,bitree e)
{
if(s.top-s.base==s.stacksize)
{
s.base=(bitree *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree));
if(!s.base)
exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return 1;
}

int pop(sqstack &s,bitree &e)
{
if(s.top==s.base)
return 0;
e=*--s.top;
return 1;
}

int stackempty(sqstack s)
{
if(s.top-s.base==0)
return 1;
else return 0;
}

int createbitree(bitree &t)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
t=0;
else
{
if(!(t=(bitnode *)malloc(sizeof(bitnode))))
exit(0);
t->data=ch;
createbitree(t->lchild);
createbitree(t->rchild);
}
return 1;
}

int visit(char e)
{
if(e!='0')
{
printf("E is:%c",e);
printf("\n");
return 1;
}
else return 0;
}

int inordertraverse(bitree t, FUN f)
{
sqstack s;
bitree p;
initstack(s);
push(s,t);
while(!stackempty(s))
{
while(gettop(s,p)&&p)
push(s,p->lchild);
pop(s,p);
if(!stackempty(s))
{
pop(s,p);
if(!visit(p->data))
return 0;
push(s,p->rchild);
}
}
return 1;
}

int main(void)
{
bitree t;
char e;
int p;
e=e;
p=p;
createbitree(t);
inordertraverse(t, visit);
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧