函数指针
在程序中定义一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的其实地址称为这个函数的指针。
int square(int);
int square(int num) {
return num * num;
}
int main()
{
/*int i = 3, y = 4;
printf("互换前:i=%d,y=%d\r\n", i, y);
swap(&i,&y);
printf("互换后:i=%d,y=%d", i, y);*/
//函数指针 指针函数-> int *p();函数指针->int (*p )()该指针指向一个函数;
int num=8,i=9;
int (*fp)(int);//这是一个函数指针有一个int的返回值和一个int的形参;
printf("请输入一个整数:");
//scanf("%d",&num);
fp = square;
printf("%d\n",(*fp)(i));
printf("%d", fp(i));//这样写让人觉得是函数名而不是函数指针。
return -1;
}
int (*fp)(int);//这是一个函数指针有一个int的返回值和一个int的形参;与前面的squre函数定义相对应。 (*fp)(i)里的i就是squre里num的实参。
用指向函数的指针做函数参数
int add(int, int);
int sub(int, int);
int calc(int(*fp)(int, int), int, int);
int add(int num1,int num2) {
return num1 + num2;
}
int sub(int num1, int num2) {
return num1 - num2;
}
int calc(int (*fp)(int, int), int num1, int num2) {
return (*fp)(num1, num2);
}
int main()
{
printf("%d\n", calc(add, 8, 7));
把一个函数指针当做函数参数。
int calc(int(*fp)(int, int), int, int);这个函数里有三个参数:
1.一个指针,这个指针为函数指针
2.int变量
3.int变量
int calc(int (*fp)(int, int), int num1, int num2) {
return (*fp)(num1, num2);
}
printf("%d\n", calc(add, 8, 7));
(*)fp(int)(int)该指针指向了add这个函数,又因为calc里返回的是函数指针所指向函数里的值,那个值为Int所以与calc前面的类型名刚好对应,所以把num1和num2给了函数指针进而进行运算。
返回指针值的函数
int calc(int(*fp)(int, int), int, int);
int (*select(char))(int, int);
int add(int num1,int num2) {
return num1 + num2;
}
int sub(int num1, int num2) {
return num1 - num2;
}
int calc(int (*fp)(int, int), int num1 , int num2) {
return (*fp)(num1, num2);
}
int (*select(char op))(int, int) {
switch (op) {
case '+':return add;
case '-':return sub;
}
}
int main()
{
int (*fp)(int, int);
fp = select('+');
printf("%d\n", calc(fp, 8, 7));
int (*select(char))(int, int); 这个定义实际上就是定义了一个名为select的函数。这个函数的形参为char,这个函数的返回值是一个指针,,返回指针值的函数的一般形式为:
类型名 +星号+函数名(参数列表)
比如 int *a(int x,int y);第一个int表示返回的指针指向整形变量。而在int (*select(char))(int, int);中返回的是一个int类型的并且参数为2个int的函数指针。因为*select(char op)
这个函数返回的是一个指针,而这个指针与前面int 。。。 (int, int)
结合,变成了函数指针的形式。所以该select函数返回的是一个函数指针。所以当select函数里面的实参变成+时,该函数的返回值指向的是add这个函数。