A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

int * f(int * p);
int (*f)(int * p);看晕了,怎么区分的

20 个回复

倒序浏览
你这发的我也看晕了!
回复 使用道具 举报
记住优先级 变量名最先和什么结合就是什么
回复 使用道具 举报
怎么搞,有人给说一下啊,顶顶顶
回复 使用道具 举报
晗修 发表于 2015-6-8 01:04
记住优先级 变量名最先和什么结合就是什么

能详细说下嘛
回复 使用道具 举报
本帖最后由 talent123 于 2015-6-8 17:54 编辑

你没看见后者有2个括号吗?(*f)
int *f (int a, int b);函数f的返回值是指针,有2个整形形参,分别是a,b.
int (*f) (int a, int b); 一个指向函数的指针f,该函数有个2形参,分别是整形、整形。也可以写成int (*f)(int, int);至于到底指向哪个函数,后面需要再写,比如:f= sum;
回复 使用道具 举报
int *f(int* p)表示这个函数的功能是返回一个地址.  int(*f)(int * p)呢表示本身是一个函数的指针.它要指向一个函数才能有用.指向一个函数之后可以用它来代替该函数,这么说明白了吧?
回复 使用道具 举报

int * f(int * p);
int (*f)(int * p);
第一个:
先找到变量名f,f()的优先级比*f的优先级高  所以f是个函数名,()中是这个函数的形参 int *p 去掉f()以及其中的形参 剩下的int * 就是该函数的 返回值 于是第一个就是一个返回值是int指针的函数 简称指针函数
第二个找到变量名f,因为()的原因  f先和*结合,于是f就是个指针名,然后(*f)右边又有()说明这是个指向函数的指针,而这个函数的形参是*p 返回值就是去掉(*f)(int*p)剩下的 int
总结就是f是个指向形参为int型指针返回值为int型的函数的指针,简称函数指针。

更加复杂的声明也可以这样辨别
比如float(*(*f)(int,int,int))(int);

1先找到变量名f  然后发现f先和*结合 说明f是个指针
2(*f)右边有个(int int int)说明f是个指向函数的指针 形参为3个int
3替换掉(*f)(int int int) 剩下的就是这个函数的返回值 float(*p)(int)
4 这个上面已经解释过 是个指向形参int返回值float的函数的指针
5所以f是个函数指针  指向的函数形参为3个int 返回值还是个函数指针 指针指向一个返回值float形参int的函数

总之就是记号()[]的优先级相等 从左往右结合,*的优先级是比()低一级的而*是从右往左结合
然后声明是从变量名开始一层一层往外加,解读也是从变量名开始一层一层解读。
无论是函数还是数组还是指针都很清楚了

点评

说的真详细,学习了。  发表于 2015-6-10 08:57
回复 使用道具 举报
晗修 发表于 2015-6-8 18:41
int * f(int * p);
int (*f)(int * p);
第一个:

我靠,兄台,太凶了,回答的太好了
回复 使用道具 举报
tutucoo 发表于 2015-6-8 17:59
int *f(int* p)表示这个函数的功能是返回一个地址.  int(*f)(int * p)呢表示本身是一个函数的指针.它要指向 ...

明白了,吊的不行啊
回复 使用道具 举报
        1,指针作为函数参数的用途
                void sumAndMinus(int a, int b, int *s, int *m) // 指针变量只能接收变量地址
                {
                        *s = a + b;
                        *m = a - b;
                }

                int main()
                {
                        int sum, minus;
                       
                        sumAndMinus(10, 7, &sum, &minus);

                        printf("和为:%d \n差为:%d \n", sum, minus);
               
                        return 0;
                }

        2,返回指针的函数
                ,// 返回指针类型的数据,即返回指针的函数
                char *test()
                {
                        return "rose";
                }

                int main()
                {
                        char *name = test();
                        printf("name = %s \n", name);
                        return 0;
                }

        3,指向函数的指针
                void test()
                {
                        printf("调用了test函数\n");
                }
                        int sum(int a , int b)
                {
                        retrun a+b;
                }

                int main()
                {
                        // (*p)是固定写法,代表指针变量p将来肯定是指向函数
                        //左边的void代表,指针变量p指向的函数没有返回值
                        //右边的()代表,指针变量p指向的函数没有形参
                        void (*p)(); //无返回值,无形参
                        int (*p1)(int, int); //有返回值,有形参
                        //指针变量p指向了test函数
                        p = test;
                        p1 = sum;
                        test(); //直接调用

                        (*p)(); //间接调用
                        (*p1)(10, 11);

                        p(); //间接调用1
                        p1(10, 11); //间接调用1               
                        return 0;
                }
回复 使用道具 举报
学习学习
回复 使用道具 举报
后面的(int * p)都表示参数,第一个就是一个f函数返回int指针,第二个表示定义一个指针,指向函数
回复 使用道具 举报
前者为指针函数,返回值的类型为指针或地址,后者为函数指针,f存的是函数的首地址,f必须指向一个函数才有用,f作为形参可以串地址给形参。应该就是这个区别吧。
回复 使用道具 举报
我也看晕了,围观学习
回复 使用道具 举报
luguo 中级黑马 2015-6-12 09:30:16
16#
一个是返回指针的函数,一个是指向函数的指针
回复 使用道具 举报
围观学习
回复 使用道具 举报
牛人很多  菜鸟来围观学习
回复 使用道具 举报
围观学习,不错不错加油哦
回复 使用道具 举报
看晕了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马