【C语言】指针函数和函数指针的区别及函数指针详解

来源:互联网 发布:mac safari历史记录 编辑:程序博客网 时间:2024/06/03 12:31

1.指针函数

  先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。

int *f(int a, int b);  

  即指针函数是指:返回值是指针的函数,其本质是一个函数。

2.函数指针

  顾名思义,函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。

函数指针的定义如下:

int (*f)(int a, int b); // 声明函数指针

函数指针详解:

引言:

  我们都知道,数组名就是指向数组第一个元素的常量指针。同理,对于一个函数而言,函数名也是指向函数第一条指令的常量指针。而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址。一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针,该指针可以看作是它指向函数的别名,所以我们可以用该指针来调用这个函数。

函数指针的声明方法:

返回值类型 ( * 指针变量名) ([形参列表]);

Eg:int (*f)(int a, int b)
#include <stdio.h>int add (int num, int num1) {    return num + num1;}int main() {    int (*p_func)(int,int) = NULL;//函数指针声明    p_func = add; //将函数赋值给函数指针    printf("add是:%p\n", add);    printf("结果是:%d\n",p_func(4,7));//函数指针的调用,跟调用函数一样`    return 0;}

把函数指针当成一个数组的指针

//实现显示void print_cb(int *p_num) {     printf("%d ", *p_num); } //实现循环 void for_each(int *p_num, int size, void (*p_func)(int*)) {     int num = 0;     for(num = 0; num <= size - 1; num++) {         p_func(p_num + num);     } } int main() {     int arr[] = {1, 2, 3, 4, 5};     for_each(arr, 5, print_cb);//使两个函数链接,把函数的地址传过去,当调用该函数指针的时候就调用该函数     printf("\n");     return 0; }

  注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

  注2:函数括号中的形参可有可无,视情况而定。

  更为详细的内容见:http://blog.jobbole.com/44639/

原创粉丝点击