1、指针函数:本质是一个函数。函数返回类型是某一类型的指针
格式: 类型标识符 *函数名(参数表)
int *f(x,y);
1
2
3
4
5
|
float
*fun();
float
*p;
p = fun(a);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int
* find(
void
);
int
* find(){
int
*pp ;
pp= 0;
return
pp;
}
int
main(
int
argc,
const
char
* argv[]) {
int
*pp ;
pp = find();
return
0;
}
|
本质是函数 只是这个函数返回的是一个执行某一类型数据的指针;
2、函数指针是指向函数的指针变量,即本质是一个指针变量。
格式:类型说明符 (*函数名)(参数)
int (*f) (int x);
指向函数的指针包含了函数的地址,可以通过它来调用函数
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数实现地址。指针的声明笔削和它指向函数的声明保持一致。
1
2
3
4
5
6
7
8
9
10
11
12
|
int
xMax(
int
a,
int
b){
return
a>b?a:b;
}
int
main(
int
argc,
const
char
* argv[]) {
int
(*xMaxValue)(
int
a,
int
b) = &xMax;
// &可以省略
int
d = xMaxValue(xMaxValue(2,4),3);
printf(
"最大的数字是: %d\n"
, d);
}
|
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
3、回调函数
函数指针作为某个函数的参数
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
简单讲:回调函数是由别人的函数执行时调用你实现的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// 回调函数
void
populate_array(
int
*array, size_t arraySize,
int
(*getNextValue)(
void
))
{
for
(size_t i=0; i<arraySize; i++)
array[i] = getNextValue();
}
// 获取随机值
int
getNextRandomValue(
void
)
{
return
rand();
}
int
main(
void
)
{
int
myarray[10];
populate_array(myarray, 10, getNextRandomValue);
for
(
int
i = 0; i < 10; i++) {
printf(
"%d "
, myarray[i]);
}
printf(
"\n"
);
return
0;
}
|