指针函数和函数指针

news/2024/11/18 2:23:57/

C语言中的指针和函数是其核心特征之一。它们能够提供强大的灵活性和扩展性,对于C语言程序的开发非常重要。在C语言中,还有两个与指针和函数有关的概念需要进一步了解,即函数指针和指针函数。

1、函数指针

1.1

函数指针是指向函数的指针变量。它允许通过变量名引用函数,而不是通过函数名。在C语言中,函数名实际上是函数代码的内存地址。因此,函数指针存储着代码段中相应的地址。使用函数指针可以方便地在代码中传递和使用函数作为参数,也可以在程序运行时动态地指定需要调用的函数。

在C语言中,函数指针的声明方式比较特殊。例如,以下是一个简单的函数指针:

```

int (*funcPtr)(int, int);

```

上面的声明意味着“funcPtr”是一个指向函数的指针变量,该函数返回类型为int,并且接受两个整型参数。

为了调用该函数指针,需要将其指向需要调用的函数。例如,以下代码演示了如何将函数指针指向一个函数:

```

int add(int x, int y) {

return x+y;

}

int (*funcPtr)(int, int);

funcPtr = add;

``

通过将“add”函数的地址赋给函数指针“funcPtr”,现在可以通过“funcPtr”变量调用“add”函数了:

```

int result = (*funcPtr)(2, 3);

```

在这里,“result”变量等于5,即调用“add”函数传递整型参数2和3的结果。

=====================================================

1.2

定义

我们看个代码

int *func(int a,int b)

我们之前说过运算符的优先级,*的优先级低于(

由于“*”的优先级低于“()”的优先级,因而func首先和后面的“()”结合,也就意味着,func是一个函数。即:

int *(func)(int a,int b)

然后这个函数的返回值的类型是 int * 即:指向int类型的指针

然后我们这样修改上面的代码

int (*func)(int a,int b)

(*func)说明func是一个指针,然后后面跟着()说明这个指针指向一个函数,即函数指针。

所以

函数指针:首先是一个指针,这个指针指向一个函数

指针函数:首先是一个函数,这个函数的返回值一个指针

 
用typedef声明一个函数指针

我们声明一个函数指针,正常方法是

int (*pfunc)(int a,int b)

当我们命名很多个函数指针的时候,用上面的方法显得非常不方便,所以我们可以这样做

    typedef int (*PF) (int a,intb)
    PF pfunc;

例程:

    #include "stdio.h"
     
    typedef int(*PF)(int, int);
     
    int add(int a, int b)
    {
        return a + b;
    }
     
    int reduce(int a, int b)
    {
        return a - b;
    }
     
    int main()
    {
        PF pfunc = NULL;
        pfunc = add;
        printf("add:%d\n",pfunc(3, 4));
        pfunc = reduce;
        printf("reduce:%d\n", pfunc(3, 4));
        /*getchar是用VS编写方便查看输出*/
        getchar();
        return 0;
    }


 

2、指针函数

指针函数是返回指针的函数。它允许返回指向指针的指针,也可以返回指针数组。指针函数可以用于动态内存分配、数据结构遍历等场景。此外,它也可以浓缩代码思路,提高代码的可读性和可维护性。

以下是一个示例指针函数:

```

int* getArray() {

static int arr[3] = {1, 2, 3};

return arr;

}

```

该函数返回一个指向整型数组的指针。在程序中,指针函数可以像另一个指针变量一样使用,代码可以按以下方式访问函数返回的数组中的元素:

```

int* arrPtr = getArray();

for(int i=0; i<3; i++) {

printf("%d ", arrPtr[i]);

}

```

运行结果是:1 2 3

在本例中,指针函数实现了一个静态整型数组,然后返回一个指向该数组的指针。相应地,指针变量“arrPtr”指向该数组的地址。最后,使用“arrPtr”指针来访问数组中的元素。

小结

函数指针和指针函数是C语言中两个不同的核心概念。使用函数指针可以方便地传递和使用函数作为参数,而使用指针函数可以返回指向指针的指针或指向指针数组的指针。两者都是对C语言功能的补充,可以提高代码的易用性和灵活性。


http://www.ppmy.cn/news/1043630.html

相关文章

GitKraken保姆级图文使用指南

前言 写这篇文章的原因是组内的产品和美术同学&#xff0c;开始参与到git工作流中&#xff0c;但是网上又没有找到一个比较详细的使用教程&#xff0c;所以干脆就自己写了一个[doge]。文章的内容比较基础&#xff0c;介绍了Git内的一些基础概念和基本操作&#xff0c;适合零基…

helm安装harbor + nerdctl 制作push 镜像

参考 文章&#xff1a;Helm部署Harbor_helm harbor_风向决定发型丶的博客-CSDN博客 安装好后使用 nerd containerd对接harbor_containerd 容器 insecure-registries 配置_柠是柠檬的檬的博客-CSDN博客 推送镜像 Containerd 对接私有镜像仓库 Harbor - 知乎 接下来我们来…

ProGuard + SpringBoot3 + JDK17

1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

Integer中缓存池讲解

文章目录 一、简介二、实现原理三、修改缓存范围 一、简介 Integer缓存池是一种优化技术&#xff0c;用于提高整数对象的重用和性能。在Java中&#xff0c;对于整数值在 -128 到 127 之间的整数对象&#xff0c;会被放入缓存池中&#xff0c;以便重复使用。这是因为在这个范围…

Web服务器群集:Linux常用服务端口号

目录 一、理论 1.常用服务端口号 一、理论 1.常用服务端口号 表1 Linux常用服务端口号 端口 服务 21 FTP文件传输服务 22 SSH远程连接服务 23 TELNET终端仿真服务 25 SMTP简单邮件传输服务 53 DNS域名解析服务 69 TFTP简单文件传输协议 80 HTTP超文本传输服务 110 POP3用于…

STM32CubeMx之freeRTOS定时器使用

需要修改定时器时钟 xTimerChangePeriod(tim1Handle,500,200);//发送队列等待时间 第二个参数为修改的ms xTimerStart(tim1Handle,100);//开启定时器 xTimerStop(tim1Handle,100);//关闭定时器 一定注意定时器任务优先级 要大一点 不然会使用不了

使用SpringBoot + Thymeleaf 完成简单的用户登录

&#x1f600;前言 本篇博文是关于Thymeleaf 的综合案例&#xff0c; 使用SpringBoot Thymeleaf 完成简单的用户登录-列表功能&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后&#xff0c;可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后&#xff0c;再连接虚拟机就连不上了&#xff0c;于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题&#xff0c;又可以连接上了&#xff…