函数指针和指针函数

1.  函数指针定义

函数类型 (*指针变量名)(行参列表);

"函数类型"说明时函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

   int (*f)(int x);

   double (*ptr)(double x);

在定义函数指针的时候注意:

函数指针和它指向的函数的参数个数和类型都应该是一致的。

函数指针的类型和函数的返回值的类型也必须是一致的。

2.函数指针的赋值:

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名即可.

例如  :

int func(int x); //声名一个函数

int (*func)(int x);//声明一个函数指针

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

 

3通过函数指针调用函数:

函数指针是通过函数名及有关参数进行调用的。

与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

首先,要说明函数指针变量。

例如:int (*f)(int x);

其次,要对函数指针变量赋值。

例如: f=func;    (func(x)必须先要有定义)

最后,要用 (*指针变量)(参数表);调用函数。

例如:    (*f)(x);(x必须先赋值)

//函数指针的例子
#include <stdio.h> #include <stdlib.h> int f( int x); int main() { int (*s)(int y); s = f ; int fg = 9090; (*s)(fg); } int f(int x) { printf("%d\n",x); }

 

4.指针函数:

一个函数可以带回整形,字符等实型的数据,还可以带回指针类型的数据,时其指向某个地址单元.

指针函数的定义: 类型标识符 *函数名(参数表)

int *f(x,y);

其中x,y是形式参数,f为函数名,调用后返回一个指向整形数据的地址指针.f(x,y)是函数,返回值是指针.

#include "stdio.h"

int  main()

{

    char *ch(char *,char *);

    char str1[]="I am glad to meet you!";

    char str2[]="Welcom to study C!";

    printf("%s",ch(str1,str2));

}

char *ch(char *str1,char *str2)

{

    int i;

    char *p;

    p=str2
    
    if(*str2==NULL) exit(-1);

    do

    {

        *str2=*str1;

        str1++;

        str2++;

    }while(*str1!=NULL);

    return(p);

}

 

 5.函数指针的回调函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int 
compare_int(int newValue, int value)
{
        if (newValue == value)
            return 1;
        return 0;
}

int serachArray( int a[], int value, int ( * compare )( int a[], int value))
{
        int i= 0;
        for( i =0 ; i <10; i++)
        {   
                if( compare( a[i], value) )
                        return  i;  
        }   
        return  -1; 
}

int
main()
{

        int a[] = {10,20,30,40,50,60,70,60,67};

        int x  = serachArray(a,70,compare_int); 
        printf("%d\n",x);
}

6.转换表:

5 int  add( int x , int y)
  6 {
  7         return  (x + y);
  8 }
  9 
 10 int sub( int x, int y)
 11 {
 12         return (x - y);
 13 }
 14 
 15 int mul ( int x, int y)
 16 {
 17         return x*y;
 18 }
 19 
 20 
 21 int div_1(int x , int y)
 22 {
 23         return x/y;
 24 }
 25 
 26 
 27 int (*oper_func[])(int, int) = { add, sub, mul, div_1};
 28 
 29 int
 30 main(int argc,   char  *argv[])
 31 {
 32      int i = 1;
 33      int x = 4;
 34      int y =5;:
 35      int cx = oper_func[i]( x , y);
 36      printf("%d\n",cx);
 37 }

 

posted @ 2012-11-30 18:06  风去无痕  阅读(285)  评论(0编辑  收藏  举报