关于函数指针的初始化

xidianxiancai 2009-01-05 06:18:45
int (*pf)(int)=&f;
这个声明创建了函数指针pf,并把它初始化为指向函数f。
请问我能否用int (*pf)(int)=f;来实现同样的功能(即去掉&)。
我认为是一样的。因为函数名和地址实际上是一样的。就如同:定义一个变量int a;那么变量名a与&a表示的是同一个地址。
我不知道我的理解是否正确?请指教。谢谢!
...全文
408 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
largehardo 2009-01-06
  • 打赏
  • 举报
回复
mark
caremsi 2009-01-06
  • 打赏
  • 举报
回复
mark.
int (*pf)(int)=&f;
貌似&在这里不是引用,是地址符哦,不能去掉吧
nicholasfly 2009-01-06
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
学习
nullah 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lbh2001 的回复:]
引用楼主 xidianxiancai 的帖子:
int (*pf)(int)=&f;
这个声明创建了函数指针pf,并把它初始化为指向函数f。
请问我能否用int (*pf)(int)=f;来实现同样的功能(即去掉&)。
我认为是一样的。因为函数名和地址实际上是一样的。就如同:定义一个变量int a;那么变量名a与&a表示的是同一个地址。
我不知道我的理解是否正确?请指教。谢谢!

对函数部分的理解是对的,即使你写为f,编译器也会转换为&f但后面是错的
定义…
[/Quote]
up
thecorr 2009-01-05
  • 打赏
  • 举报
回复
可以
zenny_chen 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 frankli2009 的回复:]
结帖率:0.00%
[/Quote]
呵呵。恐怕是楼主不知道“结贴”这个概念吧。

不过就函数而言,其特性与数组差不多吧,直接使用标识符表示一个存储块的首地址。
不过我个人在实际使用时习惯上会加上取地址符——“&”;这确切地表明了是函数地址。
在通过函数指针来进行间接调用时,我会使用(*pf)(0);尽管pf(0)也没问题。
frankli2009 2009-01-05
  • 打赏
  • 举报
回复
结帖率:0.00%
china_west 2009-01-05
  • 打赏
  • 举报
回复
帮顶
lbh2001 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 xidianxiancai 的帖子:]
int (*pf)(int)=&f;
这个声明创建了函数指针pf,并把它初始化为指向函数f。
请问我能否用int (*pf)(int)=f;来实现同样的功能(即去掉&)。
我认为是一样的。因为函数名和地址实际上是一样的。就如同:定义一个变量int a;那么变量名a与&a表示的是同一个地址。
我不知道我的理解是否正确?请指教。谢谢!
[/Quote]
对函数部分的理解是对的,即使你写为f,编译器也会转换为&f但后面是错的
定义一个变量int a;那么变量名a与&a表示的是同一个地址。 ----》a在作为左值的时候才是地址,作为右值的时候是内容,&a始终是地址
xiaoyisnail 2009-01-05
  • 打赏
  • 举报
回复
摘自c++ primer:
可使用函数名对函数指针做初始化或赋值,此时,直接引用函数名等效于在函数名上应用取地址操作符
davelv 2009-01-05
  • 打赏
  • 举报
回复
16位机器中指针是2个字节的,32位机器中指针是4个字节的....
扯远了..
yellowhwb 2009-01-05
  • 打赏
  • 举报
回复
"int a;那么变量名a与&a表示的是同一个地址。"
这个不一定能这样说 ,a是内存中的一个空间,这个空间是4个字节大小的。&a是a的地址!
当然,如果非要把“变量名称”和“变量的值”分开说,也可以把“变量名称定义成&a,把“变量的值”说成内存中那4个字节的值
lann64 2009-01-05
  • 打赏
  • 举报
回复
c/c++的函数名和数组名是这样处理的。加不加&都可以。
davelv 2009-01-05
  • 打赏
  • 举报
回复
int a;
a表示的是一个整形数,而&a则表示该整形数的地址,不可混为一谈...
yellowhwb 2009-01-05
  • 打赏
  • 举报
回复
当然可以这样做,C语言中函数名就是函数的地址,就像数组一样,数组名就是数组的地址!
你甚至可以这样
int (*pf)(int)=*f;
或者
int (*pf)(int)=**f;
或者
int (*pf)(int)=**********f;
waizqfor 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 xidianxiancai 的帖子:]
int (*pf)(int)=&f;
这个声明创建了函数指针pf,并把它初始化为指向函数f。
请问我能否用int (*pf)(int)=f;来实现同样的功能(即去掉&)。
我认为是一样的。因为函数名和地址实际上是一样的。就如同:定义一个变量int a;那么变量名a与&a表示的是同一个地址。
我不知道我的理解是否正确?请指教。谢谢!
[/Quote]
可以怎么理解
davelv 2009-01-05
  • 打赏
  • 举报
回复
函数指针可以这样理解,但是普通变量不是这样的
函数指针赋值的时候即使不在函数前面加上&,编译器也认为是加了&来处理,不写&是为了简单...

70,037

社区成员

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

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