指针函数、函数指针、指针函数数组

linuxC高级day7

C高级部分

一、指针函数

概念:本质上是函数,函数的返回值是地址

1、定义格式:
存储类型 数据类型 *函数名(形参)
{
    函数体;
    return 地址;
}
局部变量 -->  栈区、自动开辟自动释放
            生命周期:函数调用结束空间释放
            作用域:函数体内,定义未初始化值为随机值。
全局变量 -->  静态区(.bss-定义值0  .data-定义的同时初始化),
            生命周期:程序结束空间释放,
            作用域:整个文件,定义未初始化值为0。
堆区 ----->程序员使用时开辟,用完需要手动释放
malloc:手动开辟堆区空间函数
    #include 
    void *malloc(size_t size);
    功能:在堆区开辟空间
    参数:size:开辟空间的字节大小
    返回值:成功 -->开辟空间的首地址
           失败 -->NULL
free:手动释放堆区空间
    void free(void *ptr) //手动释放堆区空间
    功能:释放堆区空间
    参数:ptr:要释放空间的首地址
    返回值:无

指针函数、函数指针、指针函数数组_第1张图片

指针函数、函数指针、指针函数数组_第2张图片

指针函数、函数指针、指针函数数组_第3张图片

  • 二、函数指针

本质:本质上是指针是指向一个函数的指针。

函数名就是函数的首地址。

1、定义格式
存储类型 数据类型 (*函数指针变量名)(形参列表)
int add(int a,int b)
{
    return a+b;
}
int sub(int c,int d)
{
    return a-b;
}
定义指针指向这个函数:
int (*p)(int,int);
= add;// 相当于用 p代替add访问函数,指针调用函数
2、通过函数指针调用函数
    函数指针变量名(参数)-->指针代替函数名去调用函数
    (*函数指针变量名)(实参)-->不常用

用法:

当一个函数指针指向一个函数,就可以通过这个指针来调用该函数

int add(int a, int b)
{
    return a + b;
}
int sub(int c, int d)
{
    return c - d;
}


int main(int argc, char const *argv[])
{
    int (*p)(int, int) = add;
    printf("%d\n", p(1, 2));
    return 0;
}

指针函数、函数指针、指针函数数组_第4张图片

函数指针可以将函数作为参数传递给其他的函数调用

指针函数、函数指针、指针函数数组_第5张图片

举例:

1char *fun(int a,short *b);
定义一个函数指针来指向这个函数:
char *(*p1)(int,short *)=fun;
2void fun1(char *sp,int **st,int n)
定义一个函数指针来指向这个函数:
void (*p2)(char *,int **,int)=fun1;
3void *fun2(int (*sp)[3],int m);
定义一个函数指针来指向这个函数:
void *(*p3)(int (*)[3],int)=fun2;

  • 三、函数指针数组

本质是数组,元素是同类型的函数指针

  1. 定义格式:

存储类型 数据类型  (*函数指针数组名[元素个数])(形参列表)

#include 

int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int  sul(int a, int b)
{
    return a * b;
}
int less(int a, int b)
{
    return a % b;
}

int main(int argc, char const *argv[])
{
    int (*sp[4])(int, int) = {add, sub, sul, less};  // 函数指针数组的声明
    int ret = sp[1](1, 3);  // 函数的调用
    printf("%d\n", ret);
    return 0;
}

指针函数、函数指针、指针函数数组_第6张图片

你可能感兴趣的:(c语言,linux)