C语言-函数指针

Python012

C语言-函数指针,第1张

/*

函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针

原理:函数在创建好了后,函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针

函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的

函数指针的要求,

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

}

在C语言中指针函数和函数指针是两个不同的概念,不能混淆。

指针函数本质上是函数,是一个返回类型为指针的函数,如:

int* max(int *array,int n)

{

//找最大值的地址

return 最大值的地址

}

max就是一个指针函数。

而函数指针本质上是指针,是指向函数的指针,如:

int (*funp)(int a,int b)

funp就是一个函数指针,可以用它指向一个返回类型为int、有两个int类型的参数的函数。

char *match (char*s,char ch1,char ch2)

函数各部分的含义:

第一个char,一般是代表函数的返回值是一个字符。但是它后面有一个*,应该把char和*连起来看,就是char*了。

那么,第一个就是char*,代表函数的返回值是一个字符指针(地址)。

match是函数的名字。

括号内是函数的参数,多个参数用逗号分隔。本例共有3个参数:char*s,char ch1,char ch2,第一个是s,类型为char*型(字符指针型),后两个ch1、ch2都是char型(字符型)。

到这儿,你就知道去掉*match前的*为什么就不对了。

另外,括号里参数类型(如包含指针)跟函数返回值的类型无关。函数名前加不加*只与函数返回值的类型有关。