iOS开发者还记得指针函数与函数指针吗?

1,278

指针函数

指针函数: 本质上就是一个函数, 返回值是一个指针;

声明类型: 函数返回类型* 函数名([参数列表])

指针标志*可以挨着返回类型,也可以在中间,或者挨着返回函数名,挨着返回类型更能表示这是一个指针函数;

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;
}

欢迎大佬留言指正😄,码字不易,觉得好给个赞👍 有任何表达或者理解失误请留言交流;共同进步;