C语言:函数指针与指针函数

举报
JeckXu666 发表于 2022/01/17 23:53:11 2022/01/17
【摘要】 文章目录 C语言:函数指针与指针函数一、概念二、创建形式2.1 普通函数创建形式:2.2 指针函数创建形式:2.3 函数指针创建形式: 三、使用例子3.1 指针函数返回字符串3.2 函数指针...

C语言:函数指针与指针函数

C语言中常常出现函数指针和指针函数两个名词,本文分析一下两者的区别

一、概念

函数指针: 本质上是一个指针,但指向的是一个函数首地址(指针不能偏移),可以用函数指针来传递函数,常用于回调函数中

指针函数: 本质上是一个函数,函数的返回值是一个指针,常用于返回数组、字符串等数据结构指针

二、创建形式

2.1 普通函数创建形式:

形式为:变量类型+ 函数名(参数)

例子如下:

char fun(char arg);

  
 
  • 1

2.2 指针函数创建形式:

形式为:指针类型 + 函数名(参数)

例子如下:

char* fun(char arg)
{
    //函数内容
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

记忆方法:因为本质上是一个函数,其写法本质上就是用指针类型来替代普通函数定义中的类型就行

2.3 函数指针创建形式:

形式为:指针类型 + 函数名(参数)

例子如下:

char (*fun)(char); //定义一个函数指针
char fun_1(char x) //定义一个函数体
{
    //函数内容
    return 0;
}
fun= & fun_1	//函数体与指针相关联

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

记忆方法:函数指针本质上是一个指针,相对于常用的普通函数定义,其实就是把它函数名部分用指针来代替

三、使用例子

3.1 指针函数返回字符串

以典型的字符串复制函数 strcpy 为例子,传入两个字符串a、b指针做参数,拷贝b的内容到a之后返回a的指针

char* strcpy(char* a,char* b)
{
    char* c=a;		//拷贝a的地址
    assert((a != NULL) && (b != NULL)); //判断输入正常
    while((*c++ = *b++)!='\0'); //使用拷贝的地址进行自加,将b的程序赋值到a中
    return a;	//返回a的地址
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

assert(条件语句):断言函数,相当于一个if判断句,判断内容为真时程序正常运行,为假则报错,终止程序执行

3.2 函数指针做回调函数

回调函数就是一个通过函数指针调用的函数,我们把函数的**指针(地址)**作为参数传递给另一个函数,然后在该函数中使用地址来回调被传递过来的函数,这就是我们说的回调函数

下面为一个演示函数,主函数中将函数指针传入中间函数,然后中间函数调用指向的函数

#include<stdio.h>

int callback_1(void) //回调函数1主体
{
    printf("call_1\n");
    return 0;
};

int callback_2(void) //回调函数2主体
{
    printf("call_2\n");
    return 0;
};

//定义一个处理函数,传入的是函数指针
int Handle(int (*callback)(void))  
{
    //回调函数
    callback();
}

int main()
{
    //定义两个函数指针来指向函数地址
    //不定义也可以,因为函数名称本身就是函数入口地址
    int (*call1)(void)=&callback_1;
    int (*call2)(void)=&callback_2;

    Handle(call1);
    Handle(call2);

    //改变函数指针指向
    call1=&callback_2;
    Handle(call1);
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

运行结果

20210805001256

文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_45396672/article/details/119396143

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。