C语言:指针函数和函数指针的理解

前言

关于指针数组,数组指针的解释:C语言:指针数组和数组指针的理解

正文

定义

// 正常函数
int fun(int x, int y);
// 指针函数
int *fun(int x, int y);
// 函数指针
int (*fun)(int x, int y);


** 指针函数本质是一个函数,其返回值为指针。**
** 函数指针本质是一个指针,其指向一个函数。**
  • 正常函数:函数名为fun,两个形参为(int x, int y),返回值为int整形。
    声明格式:类型标识符 函数名(参数)

  • 指针函数:就是一个返回指针的函数,其本质还是一个函数,而该函数的返回值是一个指针。
    声明格式:类型标识符 *函数名(参数)

  • 函数指针:本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针
    声明格式:类型说明符 (*函数名)(参数)

指针函数

概念:

指针函数:相较于正常函数,在函数前面多了个 * 号,但是这个 * 会和int组成 int * ( int 类型的指针,是个地址)的返回值,和正常函数相比,不过是返回值是个指针

写法:
int *fun(int x, int y);
int * fun(int x, int y);
int* fun(int x, int y);

三种写法都是一样的,不过如果 * 靠近返回值类型会比较好理解,推荐第三种写法。

示例:
#include <stdio.h>
#include <stdlib.h>

int sum = 0;
int Max(int x, int y)
{
    
    
	return (x>y?x:y); 
}

//指针函数
int* P_Add(int x, int y)
{
    
    
	sum = x + y;
	return &sum;
}

int main()
{
    
    
	int *pTemp, Temp;
	pTemp = P_Add(100,50);
	printf("Add Result: %d\n", *pTemp);
	
	Temp = Max(100,50);
	printf("Max Value: %d\n", Temp);
	return 0;
}

result

函数指针

概念:

函数指针:相比较于指针函数,把 * 和 函数名括一起,一种特殊的指针,指向函数的入口

使用:

函数指针需要把一个函数的地址赋给它。

int (*fun)(int x, int y);
fun = Function;

如果是函数调用,使用如下:

x = (*fun)();
x = fun();
示例:
#include <stdio.h>
#include <stdlib.h>

/*
* 定义一个函数指针p,只能指向返回值为int,形参为两个int 的函数
*/
int (*p)(int,int);

int Max(int x, int y)
{
    
    
	return (x>y?x:y); 
}

int Min(int x, int y)
{
    
    
	return (x<y?x:y); 
}

int main()
{
    
    
	int Num1 = 100, Num2 = 50;
	p = Max;
	printf("Max Value: %d\n", p(Num1, Num2));
	
	p = Min;
	printf("Min Value: %d\n", p(Num1, Num2));
	return 0;
}

result1

问题

我写完我在想,直接函数名调用和函数指针调用的区别,然后找到了如下答案:

  • 直接用函数名调用除了可读性好一点外,没有多少优势,如果你想写一个通用一点的方法来处理不同的函数,则调用不同函数的地方需要多次类似重复地使用不同的函数去调用
  • 使用函数指针就可以避免这个问题,不管是普通调用或者是形参,只要参数类型和返回值一致即可,不必重复使用函数名,尤其是函数指针数组更是使用得广泛

猜你喜欢

转载自blog.csdn.net/qq_30722795/article/details/108130197