C++——函数地址和函数指针

时间:2024-03-18 17:19:31

每天进步一点点,目标距离缩小点


今天分享此内容的原因是在书本上遇到这样的一题,让我卡了大半会。

于是复习函数地址和函数指针,顺便分享给大家,如果有什么地方不对,请多多指教!

有以下语句,则以下不正确的赋值语句是(    )。

typedef double funt(double);  funt fun13, fun14, *pfun;

(A)pfun=fun13;             (B)pfun=&fun14;            (C)pfun=*fun13;             (D)fun13=fun14;

首先,本题的正确选项是D

ABC在codeblocks的编译器上是能正确编译的

 C++——函数地址和函数指针

以下说明原因;

函数语句经过编译器编译后,生成的都是二进制代码,每个函数模块都有一个首地址。而这个首地址,就是函数的入口地址,或者说是函数指针(指针概念请自行学习)

对于一个已经定义的函数,它的名字就是函数的入口地址。

C++——函数地址和函数指针

在这里,function1,function2,function3都是函数名,他们代表的都是地址或者说是指针。

 

以下只针对function1进行说明。

 C++——函数地址和函数指针

 funciton1表示的是地址那么,它取地址后的(&funciton1)还是地址,等价于funciton1,

因此(&funciton1)(2)可以正确的调用,同理(*function1)(3)也能够正确调用。


用输出流输出它们的地址就更明确了;

C++——函数地址和函数指针

 可见,函数名代表的是地址。当然上面的输出函数的地址时用了强制转化,在不用的编译器上的要求是不同的。

在codeblocks和Dev-C++中是需要强制转化为指针类型,否则得要的结果是1。

但是再VSC++中用

cout<<function1<<endl;

是可以直接得要函数地址的。