函数调用问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 12:21:52
#include "stdio.h"
int and(int x,int y)
{int z;
z=x+y;
return(z);
}
int print(int (*p)())
{
printf("%d",p);
}
main()
{int x,y;
scanf("%d%d",&x,&y);
print(and(x,y));

}
运行成功了,但是出现警告:不可移动的指针(地址常数)转换在main函数中...怎么改正才能消除这个警告?
可是在这里,你把P改成了一个整型变量了,不能改成函数指针?只是想熟悉。。。啊哦。。。还是出现了。。。^_^这次不是不仅有警告,还有三个错误。。。

虽然你觉得“运行成功了,但是出现警告”,可是这里的警告却揭示出你所犯的一个重大概念错误。在C语言中,一个参数只能以一个值的方式被传递。在你所定义的print函数中,你定义了一个参数p,但在main里面调用print函数时,你却希望一次将三个参数传递过去。这是不可能做到的。程序并没有按照你的想象运行,而是先将and(x,y)计算出来成为一个整数值,然后试图将其作为一个函数指针传过去,因此出现上述警告。

Leo239的方法思路是对的,只是有点小疏忽。
printf("%d",(int)*p(x,y))一句中不应写(int)*,尤其不应写这个星号。写成printf("%d",p(x,y))就对了。

另外,从楼主的例子开始就存在一个问题,即把无返回值的print函数定义成int型。应该把int改为void。

#include "stdio.h"
int and(int x,int y)
{int z;
z=x+y;
return(z);
}
int print(int (*p)(int,int),int x,int y)
{
printf("%d",(int)*p(x,y));
}
main()
{int x,y;
scanf("%d%d",&x,&y);
print(and,x,y);

}

看来你指针那课没学好。