#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 *); // 定义了一个函数指针
int (fun)(char *); // 同上
int (*pfun)(char *); // 定义了一个函数指针
#5
int(fun)(char *);等价于 int fun(char *); 前一个加了括号等于没加
就跟int (a); 等价于int a;一样
就跟int (a); 等价于int a;一样
#6
指针函数 返回一个为char型的指针的值得函数即地址
#7
++
#8
int(fun)(char *); 和int fun(char *)是一样的
那四个正确也是一样的。因为函数的名字其实就是函数的入口地址。pfun和*pfun都是指的foo的函数入口地址。
那四个正确也是一样的。因为函数的名字其实就是函数的入口地址。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,....等效
数组名[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 *); // 定义了一个函数指针
int (fun)(char *); // 同上
int (*pfun)(char *); // 定义了一个函数指针
#5
int(fun)(char *);等价于 int fun(char *); 前一个加了括号等于没加
就跟int (a); 等价于int a;一样
就跟int (a); 等价于int a;一样
#6
指针函数 返回一个为char型的指针的值得函数即地址
#7
++
#8
int(fun)(char *); 和int fun(char *)是一样的
那四个正确也是一样的。因为函数的名字其实就是函数的入口地址。pfun和*pfun都是指的foo的函数入口地址。
那四个正确也是一样的。因为函数的名字其实就是函数的入口地址。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,....等效
数组名[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,....等效