指针函数
指针函数: 本质上就是一个函数, 返回值是一个指针;
声明类型: 函数返回类型* 函数名([参数列表])
指针标志*可以挨着返回类型,也可以在中间,或者挨着返回函数名,挨着返回类型更能表示这是一个指针函数;
int* func(int); //返回一个指向整形指针的函数
函数指针
函数指针: 本质上是一个指针,它指向一个函数类型;
函数再编译的时候,会被分配一个入口地址,函数名就是这个地址,这个地址就是这个函数的指针所指向的地址;函数的入口地址;
函数指针可以用于调用函数或者传递参数;
声明类型: 函数返回类型 (* 函数名)([参数列表])
因为参数列表的括号优先级高,所以函数名和后边的括号结合就是一个函数,所以先把指针标志
*
与函数名用括号结合,表示这是一个指针向函数的指针变量;
int* x; int* y(); int (*z)(); // x和z是指针变量,y是函数;
int (pFunc*)(int,int); //pFunc 指向一个返回int的函数
函数指针作为返回值 ,也可以作为参数使用
函数指针作为返回值: 指针函数不再返回 基本类型 如
int *
、char *
等, 而是把一个函数指针作为返回值;
void (*signal(int signo,void (*func)(int)))(int);
//函数名字是signal, 参数是int类型和func函数指针类型,函数名signal前边的星号说明返回一个指针类型,是一个指向函数的指针,指向的函数返回值是void 参数是一个int
typedef void (*pSignal)(int);
pSignal signal(int signo,void (*func)(int)); //这样更明显一些
函数指针作为参数:
void sort(int *a, int len)
{
int k , t;
for (int i = 0; i<len-1; i++) {
k = i;
for (int j = i; j<len; j++) {
if (a[k] > a[j]) {
k = j;
}
}
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
void printnum(int *a, int len, void(*p)(int*,int))
{
p(a,len);
for (int i=0; i<len; i++) {
printf("%5d",*(a+i));
}
}
int main()
{
int a[] = {12,45,13,67,78,65,49};
int len = sizeof(a) / sizeof(int);
printnum(a, len, sort);
return 0;
}