/*
============================================================================
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;
}