一、指针函数
概念:本质上是函数,函数的返回值是地址
1、定义格式:
存储类型 数据类型 *函数名(形参)
{
函数体;
return 地址;
}
局部变量 --> 栈区、自动开辟自动释放
生命周期:函数调用结束空间释放
作用域:函数体内,定义未初始化值为随机值。
全局变量 --> 静态区(.bss-定义值0 .data-定义的同时初始化),
生命周期:程序结束空间释放,
作用域:整个文件,定义未初始化值为0。
堆区 ----->程序员使用时开辟,用完需要手动释放
malloc:手动开辟堆区空间函数
#include <stdlib.h>
void *malloc(size_t size);
功能:在堆区开辟空间
参数:size:开辟空间的字节大小
返回值:成功 -->开辟空间的首地址
失败 -->NULL
free:手动释放堆区空间
void free(void *ptr) //手动释放堆区空间
功能:释放堆区空间
参数:ptr:要释放空间的首地址
返回值:无
- 函数指针
本质:本质上是指针是指向一个函数的指针。
函数名就是函数的首地址。
1、定义格式
存储类型 数据类型 (*函数指针变量名)(形参列表)
int add(int a,int b)
{
return a+b;
}
int sub(int c,int d)
{
return a-b;
}
定义指针指向这个函数:
int (*p)(int,int);
p = 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;
}
函数指针可以将函数作为参数传递给其他的函数调用
举例:
1、char *fun(int a,short *b);
定义一个函数指针来指向这个函数:
char *(*p1)(int,short *)=fun;
2、void fun1(char *sp,int **st,int n)
定义一个函数指针来指向这个函数:
void (*p2)(char *,int **,int)=fun1;
3、void *fun2(int (*sp)[3],int m);
定义一个函数指针来指向这个函数:
void *(*p3)(int (*)[3],int)=fun2;
- 函数指针数组
本质是数组,元素是同类型的函数指针
- 定义格式:
存储类型 数据类型 (*函数指针数组名[元素个数])(形参列表)
#include <stdio.h>
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;
}