/* ============================================================================ Name : TestFunction.c Author : lf Time : 2015年2月23日16:06:17 Copyright : Your copyright notice Description : 函数指针与指针函数的使用与小结 在C语言中: 函数名其实就是一个函数的起始地址. 同理:数组名其实就是数组首元素的地址. 函数指针 在程序中定义了一个函数,那么在编译时编译系统为函数代码分配一段存储空间, 这段存储空间的起始地址称为这个函数的指针. 可定义一个指向函数的指针变量存放函数的起始地址,即该指针变量指向该函数. 例如: int (*p)(int,int); 定义p是指向函数的指针变量.它所指向的函数输入参数为两个int型,返回值为int型. p的类型用int (*)(int,int)表示 指针函数 函数返回值是指针. 定义方式: 类型名 *函数名(参数表列); 小结: 区分指针函数与函数指针最简单的方式: 看函数名前面的指针*号有没有被括号包含,如果被包含就是函数指针,反之则是指针函数 其实从字面意思也可以看出来些端倪: 指针函数:本质是一个函数,返回值为一个指针的函数 函数指针:本质是一个指针,只不过该指针指向了一个函数 ============================================================================ */ #include <stdio.h> #include <stdlib.h> //声明sub函数 int sub(int a,int b); //利用typedef定义sub的函数指针 typedef int (*subFunction)(int a,int b); //声明一个指针函数 int *fu(int x); //利用typedef定义一个指针函数的类型typedef typedef int *func(int x); int main(void) { testFunctionPointer(); testPointerFunction(); return EXIT_SUCCESS; } //函数指针 void testFunctionPointer() { //函数名其实就是一个函数的起始地址 printf("sub function address=%x\n", sub); printf("======================\n"); //利用函数指针调用sub方法 subFunction s = sub; //此时s指向了sub函数的起始地址.所以打印结果同上 printf("s function address=%x\n", s); printf("======================\n"); s(9, 3); } int sub(int a,int b){ int c; c=a-b; printf("sub result=%d\n",c); printf("======================\n"); return c; } //指针函数 void testPointerFunction() { //方式一 int number = 9527; int *p = fu(number); //取出地址中的内容*p printf("number=%d\n", *p); printf("======================\n"); //方式二 int num = 502; //注意这句 func *f = fu; int *pointer = f(num); //取出地址中的内容*pointer printf("num=%d\n", *pointer); printf("======================\n"); } int *fu(int x){ int address=&x; return address; }