一个函数指针的问题

Jerryup 2014-09-16 10:07:29
请教大家个问题,为什么double * (*p2)(double n);
p2 = f1;
f1为double * f1(double n){ }类型的函数,(*p2)中的*必须有?我知道函数指针声明必须带*的,因此第一种可以理解,
但是cout<<*b(f1);
b的函数为double * b(double *(*p2)(double n)){}中的P2中的*可以省略?
意思是double * b(double *p2(double n)){}和double * b(double * (*p2)(double n)){}是一样的效果,意思是在函数类型声明时候可以省略?
...全文
351 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jerryup 2014-09-17
  • 打赏
  • 举报
回复
引用 13 楼 aa5566f4 的回复:
[quote=引用 6 楼 Jerryup 的回复:] [quote=引用 3 楼 aa5566f4 的回复:] double *(*p2)(double n); //此為指向double的指針函數 p2 = f1; //把f1的地址賦予p2 後面的我不懂你的問題是?
我的意思是说double *(*p2)(double n); 中(*p2)括号中的*为什么能省略而在函数指针声明中不能省略?[/quote] 因為他的型態是指針所以不能省 = =[/quote]怎么不见人了?
Jerryup 2014-09-17
  • 打赏
  • 举报
回复
引用 13 楼 aa5566f4 的回复:
[quote=引用 6 楼 Jerryup 的回复:] [quote=引用 3 楼 aa5566f4 的回复:] double *(*p2)(double n); //此為指向double的指針函數 p2 = f1; //把f1的地址賦予p2 後面的我不懂你的問題是?
我的意思是说double *(*p2)(double n); 中(*p2)括号中的*为什么能省略而在函数指针声明中不能省略?[/quote] 因為他的型態是指針所以不能省 = =[/quote]double *(*p2)(double n); 中(*p2)括号中的*为什么能省略?
qq_20947725 2014-09-17
  • 打赏
  • 举报
回复
很明显啊de daa
VincentZhouCVL 2014-09-17
  • 打赏
  • 举报
回复
你好,确实是可以省掉的,因为(*fp)是函数类型,编译器会自动转成指针类型,即fp的形式
赵4老师 2014-09-16
  • 打赏
  • 举报
回复
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*x000)[5];//返回值
    char (*(x00)())[5];//函数原型,参数为空,返回值为指针
    char (*(*x0)())[5];//数组的元素,是个函数指针
    char (*(*x[3])())[5];//是个数组,大小为3

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
aa5566f4 2014-09-16
  • 打赏
  • 举报
回复
double *(*p2)(double n); //此為指向double的指針函數 p2 = f1; //把f1的地址賦予p2 後面的我不懂你的問題是?
敬畏者 2014-09-16
  • 打赏
  • 举报
回复
double *p2(double n) double * (*p2)(double n) 明显是不一样的
aa5566f4 2014-09-16
  • 打赏
  • 举报
回复
引用 6 楼 Jerryup 的回复:
[quote=引用 3 楼 aa5566f4 的回复:] double *(*p2)(double n); //此為指向double的指針函數 p2 = f1; //把f1的地址賦予p2 後面的我不懂你的問題是?
我的意思是说double *(*p2)(double n); 中(*p2)括号中的*为什么能省略而在函数指针声明中不能省略?[/quote] 因為他的型態是指針所以不能省 = =
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
没人知道吗?
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
没人回答啊?
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
是不是可以这样理解,如果函数指针作为形参的时候,比如(*pf)()可以写成pf()?
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
楼主有毅力,有精力的话,建议研读一下gcc源代码中相关片断。
赵老师高看小弟了,小弟只不过刚刚研究c++,怎能理解gcc那么高深的代码?如果有兴趣,赵老师可以解答下吗?呵呵
赵4老师 2014-09-16
  • 打赏
  • 举报
回复
楼主有毅力,有精力的话,建议研读一下gcc源代码中相关片断。
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
引用 7 楼 palm_m 的回复:
不是很明白问题,能不能把问题问的更明白一些
我的意思是声明,为什么double * (*p2)(double n); p2 = f1;中的(*p2)括号里的*不能省略,但是,函数类型声明可以,double * b(double *(*p2)(double n)){}括号中的*可以省略,等价于double * b(double *p2(double n)){},在main()中调用cout<<*b(f1);两种效果一样。明白我的意思了吗?
palm_m 2014-09-16
  • 打赏
  • 举报
回复
不是很明白问题,能不能把问题问的更明白一些
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
引用 3 楼 aa5566f4 的回复:
double *(*p2)(double n); //此為指向double的指針函數 p2 = f1; //把f1的地址賦予p2 後面的我不懂你的問題是?
我的意思是说double *(*p2)(double n); 中(*p2)括号中的*为什么能省略而在函数指针声明中不能省略?
Jerryup 2014-09-16
  • 打赏
  • 举报
回复
引用 2 楼 u013573183 的回复:
double *p2(double n) double * (*p2)(double n) 明显是不一样的
我在调试中结果一样,都可以运行

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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