指针函数、数组指针、函数指针、函数指针数组和指向函数指针数组的指针

指针数组

  • 是个数组,是一个可以存放指针的数组

int * a[10] 是一个整型数组。

char** a[10]是一个二级指针数组。

数组指针

  • 是一个指针

  • int(*p)[10],int(*p)表示是一个指针变量,[10]则表示指向一个数组

可以通过数组指针找到数组里面的内容,主要应用于二级指针的访问

数组指针的赋值:
int (*parr)[10] = &arr;
等价于
* ( * ( parr + 0)+ x)

  • 二维指针访问示例:
for(i=0; i<10; i++)
{
    for(j=0; j<10; j++)
    {
        printf("%d", *(*(p+i)+j));
    }
}

函数指针

  • 是个指针

    “函数指针”本身首先应是指针变量,只不过该指针变量指向函数。

    这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数 。

    如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。

    函数指针有两个用途:调用函数和做函数的参数。

函数指针数组

  • 即将函数的地址存在一块联系的地址中

    函数指针的一个用法出现在菜单驱动系统中。例如程序可以提示用户输入一个整数值来选择菜单中的一个选项。用户的选择可以做函数指针数组的下标,而数组中的指针可以用来调用函数。

int main()
{
    int(*p1)(int, int) = Add;//函数指针数组的内容函数
    int(*p2)(int, int) = Sub;

    int(*pFunArr[4])(int, int);//函数指针数组
}

指向函数指针数组的指针

  • 示例
void(*signal(int, void(*)int))(int);//函数的声明

void(*signal(int a, void(*pFun)(int)))(int)//函数的定义
{
    return NULL;
}


  • signal是一个函数的声明,函数的第一个参数类型是int,第二个参数类型是一个函数指针,这个指针能够指向参数为int,返回类型为void的函数。signal函数的返回类型也是一个函数指针,该指针能够指向函数类型为int,返回值类型为void的函数。

回调函数

  • 通过函数指针调用函数

  • 主要应用:计算器的应用;
         qsort函数
         

    • qsort函数的使用
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*n1, const void*n2)
{
    return *(int*)n1-*(int*)n2;
}

int main()
{
    int arr[] = {6,5,4,3,2,1};
    int sz = sizeof(arr);
    int sz_1 = sizeof(arr[0]);
    int n = sizeof(arr)/sizeof(arr[0]);
    int i = 0;


    qsort(arr, n, sz_1, cmp);

    for(i=0; i<n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
 } 
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页