一道C语言笔试基础的选择题,不解

xinyilixun 2013-04-29 05:55:15

设有以下函数 void fun(int n,char *s) {......}。则下面对函数指针的定义和赋值均
是正确的是:
A、void (*pf) ( int,char);pf=&fun;
B、void (*pf)();pf=fun;
C、void *pf();*pf=fun;
D、void *pf();pf=fun;

答案选B,不解,请帮忙分析
...全文
811 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
wkmwkm5135 2013-05-07
  • 打赏
  • 举报
回复
学习了
nadleeh 2013-05-04
  • 打赏
  • 举报
回复
引用 楼主 xinyilixun 的回复:
设有以下函数 void fun(int n,char *s) {......}。则下面对函数指针的定义和赋值均 是正确的是: A、void (*pf) ( int,char);pf=&fun; B、void (*pf)();pf=fun; C、void *pf();*pf=fun; D、void *pf();pf=fun; 答案选B,不解,请帮忙分析
最符合习惯标准的应该 void (*fp)(int,char*) = fun;
小小志 2013-05-04
  • 打赏
  • 举报
回复
A正确么,明天验证一下!
秃头披风侠 2013-05-04
  • 打赏
  • 举报
回复
恩,2楼和3楼是正确的... 不过第一想法是答案全错.... 看了3楼之后才想到C里面的符号解析是不带参数的....
大浩船长 2013-05-03
  • 打赏
  • 举报
回复
引用 楼主 xinyilixun 的回复:
设有以下函数 void fun(int n,char *s) {......}。则下面对函数指针的定义和赋值均 是正确的是: A、void (*pf) ( int,char);pf=&fun; B、void (*pf)();pf=fun; C、void *pf();*pf=fun; D、void *pf();pf=fun; 答案选B,不解,请帮忙分析
用排除法,首先只有A和B是函数指针,排除掉C和D;其次fun的第二个形参是char*,和A不符,排除掉A。接着看B,没有形参,在C语言中函数不定义形参是默认可以接收多个形参的,所以选B。
就是那个党伟 2013-05-03
  • 打赏
  • 举报
回复
AnYidan 2013-05-03
  • 打赏
  • 举报
回复
引用 25 楼 tskshy 的回复:
[quote=引用 3 楼 AnYidan 的回复:] 实践中几乎没有人定义函数指针而不带参数类型
pf=&fun 和 pf=fun 的写法都是正确的[/quote] void *pf();*pf=fun
艾薇儿More 2013-05-03
  • 打赏
  • 举报
回复
不好意思,回头看看说错重点了。函数本质就是一段可执行的二进制代码,函数名就是标号,该标号的值等于内存中储存函数代码的首地址。函数指针就是指向该代码的首地址,执行的就是里面的内容。调用时候应该与函数原型的参数保持一致,比如
#include<stdio.h>
typedef void(*p)(int n,int a,int b);
void f(int n,char *s)
{
printf("hello\n");
}
void main(void){
	float num;
	p P;
	P = f;
	P(1,2,3);
    
}
与函数的参数无关(大多数用到形参的时候保持一致),函数指针指向的函数的代码的首地址而已
艾薇儿More 2013-05-03
  • 打赏
  • 举报
回复
lz意思不是不会做,是为什么B可以吧。觉得跟函数原型有关,在c的旧风格当中,如果只是简单写一个单独列表来给出参数的类型的话,编译器是不会保存参数数量和类型信息的,只保存一个返回值。所以B是可行的,c++中行不通。但是建议用新式风格来书写。详细的可以看看《c专家编程》中的原型之痛,《c和指针》中也有解释都很详细了。
neutral creature 2013-05-03
  • 打赏
  • 举报
回复
根据函数的类型判断。 A B是指向函数的指针,正确,排除C D A中型参错误,B正确。 请给分,谢谢!
hello_world000 2013-05-02
  • 打赏
  • 举报
回复
ret_type func(); ret_type (*pf)(); 会被编译器解析为K&R风格C代码,编译器会假设在调用点上传递的参数是正确的。
rickys2080 2013-05-02
  • 打赏
  • 举报
回复
轻轻地我只想告诉你,A、B都是可以的。 C、D不是函数指针,你应该知道他们是错的了。 A呢,唯一的不足是参数列表不匹配,不过没关系,可以隐士转换的。至于有人说不能加&符号,说明他C语言不过关,这里&符号加和不加都是正确的,至于原因你可以查资料。 B是正确的,楼上多位已经解答了,不再多说。

#include <stdio.h>
void fun(int n,char *s)
{
	printf("hello %s\n", s);
}
int main(int argc, char *argv[])
{
	void (*pf1) (int,char);
	void (*pf2)();
	void* pf3();
	void* pf4();

	pf1=&fun;
	pf2=fun;
	//*pf3=fun;
	//pf4=fun;
	
	pf1(1, "world");
	pf2(2, "man");
	pf2();
	
	return 0;
}
彭家老三 2013-05-02
  • 打赏
  • 举报
回复
排除法可以确定ACD都是错的。参数的问题,在C里就如同11楼说的那样,括号里带void表示没有参数,如果只有括号则表示参数数量不定,这个貌似是ANSI C还是C89 的标准,前几天才看到有人提过,忘记了。
tskshy 2013-05-02
  • 打赏
  • 举报
回复
引用 3 楼 AnYidan 的回复:
实践中几乎没有人定义函数指针而不带参数类型
pf=&fun 和 pf=fun 的写法都是正确的
langzi_1949 2013-05-01
  • 打赏
  • 举报
回复
引用 8 楼 u010486565 的回复:
[quote=引用 6 楼 xiayiguo 的回复:] B 为什么正确??
B 为什么正确,你看看B 的后面void (*pf)();是一个由指针变量pf指向函数的指针函数,也就是表示这个pf是一个指针变量,后面的是pf = fun;为什么正确,那是因为函数名fun表示的是函数的首地址,所以fun也是指针,不过是指针常量,把一个指针常量赋给指针变量有什么不可以!所以它是对的。谢谢!不过有一点点问题,貌似B的两个分号不相同,注意看B、void (*pf)();pf=fun; 是作者打错了么,还是??[/quote] 确实是这样,受益匪浅
折翼断JJ 2013-05-01
  • 打赏
  • 举报
回复
所以选B是正确的。
折翼断JJ 2013-05-01
  • 打赏
  • 举报
回复
void (*pf)();为定义指向函数的指针,指向函数fun(返回值相同,形参相同即可). pf=fun;的作用是将函数fun()的入口地址赋给指针变量pf。和数组名代表数组首地址类似,函数名代表该函数的入口地址。
#include<stdio.h>
int main()
{
	int max(int x,int y);
	int(*p)();
	int a,b;
	p=max;
	a=max(1,2);
	b=(*p)(1,2);
	printf("%d\n",a);
	printf("%d\n",b);
	return 0;
}
int max(int x,int y)
{
	return (x+y);
}
自己写了个函数,希望有助于你的理解。
小小志 2013-05-01
  • 打赏
  • 举报
回复
引用 21 楼 u010172857 的回复:
[quote=引用 19 楼 u010486565 的回复:] [quote=引用 9 楼 jason_lm 的回复:] 参数列表可以不同的?,一样不解……求解
关于这个问题,我只说 指针函数只是指向函数,并没有指向参数,也就是和参数无关,我们只是定义了一个指向函数的指针函数,所以对于函数参数问题,可要可不要,但建议加上好些,有助于理解![/quote] 不是函数指针吗[/quote] 是的是的,不好意思,初涉程序!
lijunpeng71 2013-05-01
  • 打赏
  • 举报
回复
#include<stdio.h> int max(int x,int y); int main() { int(*p)(int x,int y);//修改处 int a,b; p=max; a=max(1,2); b=p(1,2); printf("%d\n",a); printf("%d\n",b); return 0; } int max(int x,int y) { return (x+y); } 15#的程序在vc++6.0中不能通过 需要修改一下!
zouxiaogang2013 2013-05-01
  • 打赏
  • 举报
回复
引用 6 楼 xiayiguo 的回复:
B 为什么正确??
fun函数名作为表达式赋值给pf,赋的值就是fun函数的指针,同是新手,不过应该是这样
加载更多回复(18)

69,371

社区成员

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

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