int (fun)(char *) 是什么类型?

时间:2021-09-13 18:49:23
#include <stdio.h>
int foo(char *s)
{
    puts(s);
    return 0;
}

int   main()
{
    int fun(char *); // 声明了一个函数
    int (fun)(char *); // ?????

    int (*pfun)(char *); // 定义了一个函数指针

    pfun = foo;
    (*pfun)("aaaa"); // 正确
    pfun("aaaa");   // 正确

    pfun = &foo;
    (*pfun)("aaaa");  // 正确
    pfun("aaaa");     // 正确
    return   0;
}


int(fun)(char *); 这个应该怎么解释?fun是什么类型?
那4个正确有什么区别?

9 个解决方案

#1


 int fun(char *); // 声明了一个函数
    int (fun)(char *); //等价于上一个,都是函数申明

#2


我猜是楼上说的,但是我没见过这样的。况且,声明啥呀,根本不用声明啊。

#3


就是函数指针,加不加括号一回事。

#4


    int fun(char *); // 声明了一个函数
    int (fun)(char *); // 同上
    int (*pfun)(char *); // 定义了一个函数指针

#5


int(fun)(char *);等价于 int fun(char *);  前一个加了括号等于没加
就跟int (a); 等价于int a;一样

#6


指针函数  返回一个为char型的指针的值得函数即地址

#7


引用 4 楼  的回复:
int fun(char *); // 声明了一个函数
  int (fun)(char *); // 同上
  int (*pfun)(char *); // 定义了一个函数指针

++

#8


int(fun)(char *); 和int fun(char *)是一样的
那四个正确也是一样的。因为函数的名字其实就是函数的入口地址。pfun和*pfun都是指的foo的函数入口地址。

#9


在语法层面,函数名与数组名类似:数组名是指向数组首元素的指针,而函数名是指向函数首地址的指针。还要注意到这两个指针“使用”时的形似
数组名[k]----表示引用第k个数组元素
函数名(k)----表示调用函数(并传参)

下面进一步说明函数指针(即指向函数的指针变量)及表达式
程序运行后,函数代码在内存的位置是不变的。所以函数名是指针值不变量(说指针常量也可)--例如foo

1.而指向函数的指针变量(*pfun)的初始化如下:
int (*pfun)(char *)=foo;
int (*pfun)(char *)=&foo;  
涉及了LZ的一个问题即foo和&foo同样表示函数的首地址

2.定义与赋值分开
int (*pfun)(char *); 
pfun=foo;
pfun=&foo;

3.利用函数指针调用函数----这属于表达式一级的概念,先说语法形式
函数指针(实参序列)
foo(x)-----即函数指针常量(实参)
pfun(x)-----即函数指针变量(实参)
这两个都是“函数的首地址(实参)”的基本形式
那么(*pfun)(x)呢?----它和pfun(x)一样,因为pfun和(*pfun)都表示指向函数的首地址-----这一点与数组有差别(数组名表示数组首元素地址,而*数组名表示数组首元素)

4.函数指针----构成指针值的可以是函数指针常量(函数名foo),函数指针变量(pfun),函数指针的指向(*pfun),以及更为复杂的表达式形式----如对指针的+偏移运算,对指针数组元素的引用等等。

对LZ的问题
foo----函数名,表示函数首地址
&foo----函数地址,同样表示函数首地址
foo(...)和&foo(...)----调用foo函数-----直接调用

pfun----函数指针变量,代码中表示指向的函数首地址
*pfun----函数指针的引用,同样表示指向的函数首地址
pfun(...)和(*pfun)(...)----调用指向的函数foo----间接调用


参考书目----C和指针
延伸:foo,&foo,&&foo,....等效
pfun,*pfun,**pfun,....等效

#1


 int fun(char *); // 声明了一个函数
    int (fun)(char *); //等价于上一个,都是函数申明

#2


我猜是楼上说的,但是我没见过这样的。况且,声明啥呀,根本不用声明啊。

#3


就是函数指针,加不加括号一回事。

#4


    int fun(char *); // 声明了一个函数
    int (fun)(char *); // 同上
    int (*pfun)(char *); // 定义了一个函数指针

#5


int(fun)(char *);等价于 int fun(char *);  前一个加了括号等于没加
就跟int (a); 等价于int a;一样

#6


指针函数  返回一个为char型的指针的值得函数即地址

#7


引用 4 楼  的回复:
int fun(char *); // 声明了一个函数
  int (fun)(char *); // 同上
  int (*pfun)(char *); // 定义了一个函数指针

++

#8


int(fun)(char *); 和int fun(char *)是一样的
那四个正确也是一样的。因为函数的名字其实就是函数的入口地址。pfun和*pfun都是指的foo的函数入口地址。

#9


在语法层面,函数名与数组名类似:数组名是指向数组首元素的指针,而函数名是指向函数首地址的指针。还要注意到这两个指针“使用”时的形似
数组名[k]----表示引用第k个数组元素
函数名(k)----表示调用函数(并传参)

下面进一步说明函数指针(即指向函数的指针变量)及表达式
程序运行后,函数代码在内存的位置是不变的。所以函数名是指针值不变量(说指针常量也可)--例如foo

1.而指向函数的指针变量(*pfun)的初始化如下:
int (*pfun)(char *)=foo;
int (*pfun)(char *)=&foo;  
涉及了LZ的一个问题即foo和&foo同样表示函数的首地址

2.定义与赋值分开
int (*pfun)(char *); 
pfun=foo;
pfun=&foo;

3.利用函数指针调用函数----这属于表达式一级的概念,先说语法形式
函数指针(实参序列)
foo(x)-----即函数指针常量(实参)
pfun(x)-----即函数指针变量(实参)
这两个都是“函数的首地址(实参)”的基本形式
那么(*pfun)(x)呢?----它和pfun(x)一样,因为pfun和(*pfun)都表示指向函数的首地址-----这一点与数组有差别(数组名表示数组首元素地址,而*数组名表示数组首元素)

4.函数指针----构成指针值的可以是函数指针常量(函数名foo),函数指针变量(pfun),函数指针的指向(*pfun),以及更为复杂的表达式形式----如对指针的+偏移运算,对指针数组元素的引用等等。

对LZ的问题
foo----函数名,表示函数首地址
&foo----函数地址,同样表示函数首地址
foo(...)和&foo(...)----调用foo函数-----直接调用

pfun----函数指针变量,代码中表示指向的函数首地址
*pfun----函数指针的引用,同样表示指向的函数首地址
pfun(...)和(*pfun)(...)----调用指向的函数foo----间接调用


参考书目----C和指针
延伸:foo,&foo,&&foo,....等效
pfun,*pfun,**pfun,....等效