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
); } void EditFunc() { printf (EditFunc
); } 程序输出为: 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)
); scanf (%d%d,&wk,&dy); } while (wk<1 || wk>5 || dy<1 || dy>7); printf (%d
,*GetDate(wk,dy)); } |