欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-26 09:35:53
...

指针数组

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

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