函数指针简述

来源:互联网 发布:帝国cms 审核字段 编辑:程序博客网 时间:2024/06/16 13:23

1:函数指针的实质

a:函数指针的实质还是指针变量,不过指针指向的是函数。 

b:指针,函数指针,数组指针都是指针。只不过指向的内容不同。都占用4个字节。32位系统中都是4个字节

c:函数指针就是一个普通的指针变量。变量的类型是一个函数指针变量类型。它的值是某个函数的地址。

d:函数的实质是一段连续分布的代码,所以函数的第一句代码就是函数的地址。

e:C语言本身是强类型语言,编译器会进行严格的类型检查。(每一个变量都有自己变量类型)

f :函数名与数组名有所不同。最大区别是:

         函数名做右值,加不加&意义相同。数组名则不同。

void (*pFunc)(void);
//pFunc = func1;//左边是一个函数指针变量,右边是一个函数名
pFunc = &func1;// &func1和func1做右值时是一模一样的,没任何区别
pFunc ();//用函数指针来解引用以调用该函数

int *p;
int a[5];

p = a;//般配的,类型匹配的,所以编译器不会警告不会报错。
//p = &a; //类型不匹配,p是int *, &a是int (*)[5];(指针数组)
int (*p1)[5] ;
p1 = &a; // p1类型是int (*)[5],&a的类型也是int (*)[5]

g:假设我们有个函数是 :void func (void); char *strcpy(char *dest, const char *src);
对应的函数指针:void (*p) (void);char *(*pFunc)(char *dest, const char *src)
类型是:void (*) (void);

2:函数指针简单应用例子

#include <stdio.h>

int add(int a, int b);
int sub(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);
// 定义了一个类型pFunc,这个函数指针类型指向一种特定参数列表和返回值的函数
typedef int (*pFunc)(int, int);
int main(void)
{
pFunc p1 = NULL;
char c = 0;
int a = 0, b = 0, result = 0;

printf("请输入要操作的2个整数:\n");
scanf("%d %d", &a, &b);

printf("请输入操作类型:+ | - | * | /\n");

do 
{
scanf("%c", &c);
}while (c == '\n');
switch (c)
{
case '+':
p1 = add; break;
case '-':
p1 = sub; break;
case '*':
p1 = multiply; break;
case '/':
p1 = divide; break;
default:
p1 = NULL; break;
}

result = p1(a, b);
printf("%d %c %d = %d.\n", a, c, b, result);
return 0;
}
int add(int a, int b){return a + b;}
int sub(int a, int b){return a - b;}
int multiply(int a, int b){return a * b;}
int divide(int a, int b){return a / b;}