每天进步一点点,目标距离缩小点
今天分享此内容的原因是在书本上遇到这样的一题,让我卡了大半会。
于是复习函数地址和函数指针,顺便分享给大家,如果有什么地方不对,请多多指教!
有以下语句,则以下不正确的赋值语句是( )。
typedef double funt(double); funt fun13, fun14, *pfun;
(A)pfun=fun13; (B)pfun=&fun14; (C)pfun=*fun13; (D)fun13=fun14;
首先,本题的正确选项是D;
ABC在codeblocks的编译器上是能正确编译的
以下说明原因;
函数语句经过编译器编译后,生成的都是二进制代码,每个函数模块都有一个首地址。而这个首地址,就是函数的入口地址,或者说是函数指针(指针概念请自行学习)
对于一个已经定义的函数,它的名字就是函数的入口地址。
在这里,function1,function2,function3都是函数名,他们代表的都是地址或者说是指针。
以下只针对function1进行说明。
funciton1表示的是地址那么,它取地址后的(&funciton1)还是地址,等价于funciton1,
因此(&funciton1)(2)可以正确的调用,同理(*function1)(3)也能够正确调用。
用输出流输出它们的地址就更明确了;
可见,函数名代表的是地址。当然上面的输出函数的地址时用了强制转化,在不用的编译器上的要求是不同的。
在codeblocks和Dev-C++中是需要强制转化为指针类型,否则得要的结果是1。
但是再VSC++中用
cout<<function1<<endl;
是可以直接得要函数地址的。