首页 > 代码库 > 函数指针与指针函数

函数指针与指针函数

1.函数指针

指向函数的指针。本质是一个指针。

指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口地址,那么指向函数的指针变量称为函数指针变量。

引论:
int sumup(int a, float b);
int (*p3) (int a, float b);    //加入p3=&sumup;则p3作为指针指向sumup。这就是p3指针指向函数
【回顾:两者的返回值和形参都是  int    (int a, float b);】
int* (*p4)(int a, float b);
从类型上看,int*  (int a, float b) 是上式函数的指针。故有:p4 = &p3;

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

//可以通过以下两种方式将func函数的首地址赋给指针p

p=func; 

p=&func;

取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

x=(*p)();

x=p();    //虽然看起来和普通的调用无异,但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的

1
2
3
4
如使用引论中的例子有如下的调用:
sumup (100,1.21);
(*p3) (100,1.21);      //与上等价
*(p4) (100,1.21);       //与上等价

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void (*funcp)();
void FileFunc(),EditFunc();
  
main()
{
      funcp=FileFunc;
      (*funcp)();
      funcp=EditFunc;
      (*funcp)();
}
  
void FileFunc()
{
     printf(FileFunc\n);
 }
  
void EditFunc()
{
     printf(EditFunc\n);
}
程序输出为:
     FileFunc
     EditFunc

  

 
 

2.指针函数

指带指针的函数,即本质是一个函数函数返回的类型某一类型的指针,即返回一个地址给调用函数,以用于需要指针或者地址的表达式中
类型标识符  *函数名(参数表)  
如:
声明:int * f(x);
int *p;
调用:p=f(a);
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int * GetDate(int wk,int dy)    //返回某元素的地址
     static int calendar[5][7]={ 
         {1,2,3,4,5,6,7}, 
         {8,9,10,11,12,13,14},
         {15,16,17,18,19,20,21},             
         {22,23,24,25,26,27,28},              
         {29,30,31,-1}
             }; 
     return &calendar[wk-1][dy-1];  
}        
 
main()
{          
   int wk,dy;   
   do     
   {            
       printf(Enter week(1-5)day(1-7)\n);   
       scanf(%d%d,&wk,&dy);       
   }           
   while(wk<1 || wk>5 || dy<1 || dy>7);     
   printf(%d\n,*GetDate(wk,dy));     
}

  

函数指针与指针函数