函数指针与指针函数的使用与小结

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

上一篇:为什么需要消息队列,及使用消息队列的好处?


下一篇:Foreda8上安装CMake2.8.1.2