/*
成都创新互联公司专业为企业提供巩留网站建设、巩留做网站、巩留网站设计、巩留网站制作等企业网站建设、网页设计与制作、巩留企业网站模板建站服务,十余年巩留做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针
原理:函数在创建好了后,函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针
函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的
函数指针的要求,
1,首先这个指针,要和函数的返回类型一样
2,指针的*和名字,要用小括号括起来//不括起来就是指针函数了,意思就变成,函数返回一个指针了
3,最右边的小括号里形参位置的类型,形参的个数,也要和函数定义时的形参一致,只要类型,不要形参名即可,
但是加上形参名也可以,没毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定义函数指针、形参名字a、b可有可无,但有的话看上去更清晰,只要函数定义的类型、参数类型、以及参数个数,与这个指针一致,那么这个指针p,就可以指向它
p = swapchar;//p指针接管swapchar函数,只要给函数名字,就可以给过去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//这里把swapchar2函数的地址,给了p,这时p从swapchar地址,转移到了swapchar2这里。
p(chf,chg);
return 0;
}
1楼感觉对函数指针不是很了解,就不评论了. 2楼的基本还可以,但是int (*p)(),然后让它指向max函数,一个包含两个未知量的函数,这在后来的标准c里面是不支持的好像. 3楼吧,那么多*,感觉有点不大对. *是取内容,连着那么* ,我没试过,没有多少意义至少.他11级了,应该也不会怎么有错,你可以试试(我不打算加那么多*, 就不调试了).
程序里面对函数的调用,就是通过函数的入口地址,然转入函数. 这样的话,函数指针的意义就明显了.函数指针指向了函数的入口,即函数指针里是函数的入口地址. 指针不能指向函数这种说法肯定是不对的.话说回来,1楼的老兄可能看错书了,或者记错了.
类型匹配很重要,二楼的声明和使用不一致,这在老版的编译器里也是支持的.那时候ANSI标准还没有制定出来.现在而言,这种定义应该不被支持了才是.
那个声明应该如下:
int (*p)(int , int);
这样才能指向
int name(int,int)型的函数.么有实验过,但按这种写法是不错的肯定.
三楼那个********p,怎么都觉得不对.
C语言的大多语法都是简单易懂的,这常常会给初学者一种“别人都说C语言难,我看也不过如此”的感觉。但是这种感觉常常会停止在初学者学到指针时,这是一些读者跟我说的。
鉴于很多C语言初学者都觉得指针非常难,
小明定义了一个C语言函数 int f(int * ),为什么 f(5) 不能正常工作呢?
如果希望传递 5 给函数 f(),在C99中,可以使用下面这种方法:
f( (int[]){5} );
上面这行C语言代码相当于定义了一个数组,并且数组只有一个元素 5,函数 f() 接收到的参数是该数组,只不过这一过程中的数组名没有“显示”。
抛开C99的这个特性,C语言调用 f(5) 就不能这么写了,而是需要借助变量:
int five = 5;
f(five);
在C语言中,接受某个值指针的函数是有可能通过该指针修改该值的(即使程序员无此打算,C语言还是会一直这么认为),因此只有变量才能胜任。在C语言中,常数是只读的,只能作为右值, 运算符是不能处理常数 5 的,f(five) 会引发编译错误。
f(five) 会引发编译错误
表达式 * p++ 增加了 p 指向的数值,还是指针 p 本身?
C语言中的 ++ 和 — 运算符的优先级高于 * 运算符,所以 *p++ 其实就相当于 *(p++)。显然,++ 运算符增加的是指针 p 本身的值,不过在指针 p 自增之前,*p++会先返回 p 指向的值。如果希望 ++ 运算符增加 p 指向的值,应该使用括号运算符:(*p)++。
小明想使用指针操作数组里的数值,下面这段C语言代码有什么问题?
小明预计程序会输出 3,但是程序却输出了“垃圾值”,他的C语言代码如下,请看:
int array[5], i, *ip;
for(i = 0; i 5; i++)
array[i] = i;
ip = array;
printf("%d\n", *(ip + 3 * sizeof(int)));
加个注释吧:
/*
函数x
参数1: 类型 int 未标注形参
参数2: 类型 void(*)(int) 形参y
返回值: 类型 void(*)(int)
*/
void(*x(int,void(*y)(int)))(int);
其中 “void(*)(int)" 代表接收一个int参数返回类型为void的函数指针类型,比如:
void foo(int i)
{
printf("%d", i);
}
所以你可以这样调用它:
...
void (*pf)(int);
int i = 0;
pf = x(i, foo);
...