我们还是通过代码来理解 , 如下这段代码
#include<stdio.h> #include<stdlib.h> void test() { printf("test被调用\n"); } int test1(int n) { printf("test1被调用\n"); return n; } int main() { void(*p)() = test; int(*P)() = test1; int qq = *test; printf("p=%p\n", p); printf("test=%p\n", test); printf("&test=%p\n", &test); printf("*test=%p\n", *test); p(); test(); printf("test1=%p\n", test1); printf("P=%p\n", P); printf("test1返回值%d\n", P(1)); printf("test1返回值%d\n", test1(2)); P(3); test1(4); system("pause"); return 0; }运行结果如图: 其中 , test和&test的值就是函数的地址 , tset和test都是void(*)()类型 , 当然test1就为int(*)()类型 , 也可以定义函数指针来讲函数地址赋给这个变量中 , 如void(*p)() = test; p即为函数指针 . 此时在调用函数时 , 有两种方式 , 一种是通过函数名直接调用如test()(对test1为test1(2)) , 另一种就是通过函数指针来调用如p()或者q() (对test1为P(1))
提到函数指针 , 就不得不提和它听起来很像的指针函数 , 初学者可能容易将两个这个概念混淆
就如他们的名字一样 , 函数指针是指针 , 是指向函数的一个指针变量 指针函数是函数 , 是返回值为指针变量的一个函数 举个列子 :
int(*p) (); int* q();其中 , 只有一个括号之差, 就因为这个括号 , 使得p先与*结合 , 所以p是指针 , 是函数指针 q后面带着括号是一个函数 , 其返回值是int* 返回值为指针 , 所以是指针函数
我再来看一段代码
#include<stdio.h> #include<stdlib.h> int* fun(int a[]) { return &a[0]; } int main() { int a[] = { 1,2,3 }; printf("fun=%p\n", fun); printf("&a[0]=%p\n", &a[0]); printf("fun(a)=%p\n", fun(a)); int* p = fun(a); printf("a[0]=%d\n", a[0]); printf("*fun(a)=%d\n", *fun(a)); printf("*p=%d\n", *p); system("pause"); return 0; }可见fun()函数调用后返回的是a[0]的地址 , fun()返回的是int* 类型 , 所以也可以将它赋给 同类型的p