c/c++的指针函数与函数指针

news2024/11/27 4:30:53

函数

定义:
函数是数学中的一个概念,它是定义在某个数集上的一个特殊的映射关系。函数将输入值(或自变量)映射到输出值(或因变量)。函数的输入和输出可以是任何类型的数据,如数字、字符串、数组等。

函数的组成:
定义域: 函数的输入值的集合。
值域: 函数的输出值的集合。
对应关系: 输入值与输出值之间的映射关系。
函数的表示方法有多种,常用的有解析法、表格法和图象法。解析法是用数学表达式表示函数,表格法是用表格列出函数的输入值和对应的输出值,图象法则是在坐标系中画出函数的图像。

函数的应用:
函数的应用非常广泛,它可以用于描述各种自然现象和工程问题,如物理、化学、生物学、经济学等领域。在计算机科学中,函数也广泛应用于编程语言和算法设计中。

计算机领域里的函数定义:
在计算机领域,函数的概念通常指的是一种将输入转换为输出的计算方法或操作。它可以是一段代码的执行,可以接收输入并产生输出。这种计算过程可以根据输入的参数或条件进行变化,并产生不同的结果。

计算机领域中的函数通常可以分为两类:系统函数和用户自定义函数。系统函数是由操作系统或编程语言提供的标准函数,用于执行一些常见的操作,如数学运算、字符串处理、文件操作等。用户自定义函数则是由程序员根据特定需求编写的函数,用于实现特定的逻辑或算法。

在编程语言中,函数通常被定义为一个独立的代码块,可以重复使用和调用。函数的定义包括函数的名称、输入参数、返回值和函数体。函数体是实现特定功能的代码块,可以包含逻辑判断、循环、条件语句等。

函数在计算机科学中具有重要的作用,它们可以使代码更加模块化、可重用和可维护。通过将复杂的程序分解为一系列的函数,可以使程序的结构更加清晰,易于理解和维护。同时,函数还可以提高程序的效率和可靠性,因为相同的函数可以在不同的程序中重复使用,避免了重复编写代码和可能出现的错误。

——文心一言

指针

指针定义:
指针是计算机编程中一种特殊类型的变量,它存储了另一个变量的内存地址。通过使用指针,可以直接访问和修改变量的内存地址,从而实现更加灵活和高效的数据处理。

指针的声明和初始化通常需要使用星号(*)操作符。例如,如果有一个整数变量x,可以声明一个指向x的指针变量p,并将其初始化为x的地址,如下所示:

int x = 10;  
int *p = &x;

在这个例子中,变量p是一个指向整数类型的指针,它存储了变量x的内存地址。通过指针p,可以直接访问和修改变量x的值。例如,*p表示指针p所指向的变量的值,而p++则表示将指针p向后移动一个整数大小的内存地址。

指针的应用:
指针在计算机科学中具有广泛的应用,尤其是在底层编程、数据结构、算法等领域。通过使用指针,可以实现动态内存分配、函数参数传递、数据结构操作等复杂的数据处理任务。然而,也需要注意指针使用的安全性和正确性,以避免出现内存泄漏、野指针等问题。

——文心一言

指针函数

定义:
指针函数是指带指针的函数,本质上是一个函数;函数的返回类型是某一类型的指针。

作用:
指针函数可以用来操作内存地址,对数组内数据进行操作。

一般形式:

类型描述
通用<数据类型> *<函数名>(<函数参数列表>)
写法1int *pfun(int, int);
写法2int * func(int, int);
写法3int* func(int, int); #比较常用

取值运算符*的优先级低于圆括号,所以pfun首先和后面圆括号结合。

举例:

#include <iostream>
using namespace std;

int* find_max(int arr[], int size) 
{
    int* max_ptr = &arr[0]; // 假设数组的第一个元素是最大的  

    for (int i = 1; i < size; i++) 
    {
        // 如果当前元素比最大值还大  
        if (*max_ptr < arr[i]) 
        {  
            max_ptr = &arr[i]; // 更新最大值的指针  
        }
    }
    
    return max_ptr; // 返回最大值的指针  
}

int main() 
{
    int arr[] = { 3, 7, 2, 8, 1, 9, 5, 6, 4 };
    
    int size = sizeof(arr) / sizeof(arr[0]); // 计算数组的长度  

    int* max_value_ptr = find_max(arr, size); // 调用指针函数  

    cout << "The maximum value is:" <<  *max_value_ptr << endl;// 通过指针获取最大值并打印出来  

    return 0;
}

因此,利用指针函数就可以找到一个数组中最大值。
在这里插入图片描述

函数指针

定义:
函数指针是指向函数的指针变量,本质是一个指针变量;它指向函数的首地址。

作用:
函数指针允许在运行时候动态地选择要调用的函数;代码的高度复用;提供结构清晰的分层设计和灵活性,便于抽象。

函数的指针和函数指针:
在程序中定义一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址称为这个函数的指针;而指针函数是指向函数的指针变量。

一般形式:

类型描述
通用<数据类型> (*<函数名>)(<函数参数列表>)
写法int (*pfun)(int, int);

举例:

#include <iostream>
using namespace std;

// 声明一个函数指针类型  
typedef int (*func_ptr)(int, int);

// 定义一个加法函数  
int add(int a, int b) 
{
    return a + b;
}

// 定义一个减法函数  
int subtract(int a, int b) 
{
    return a - b;
}

int main() 
{
    // 声明一个函数指针变量,并初始化为加法函数的地址  
    func_ptr func = add;
    int result = func(3, 4); // 调用加法函数,结果为7  
    printf("Add result: %d\n", result);


    // 修改函数指针变量,指向减法函数的地址  
    func = subtract;
    result = func(3, 4); // 调用减法函数,结果为-1  
    printf("Subtract result: %d\n", result);


    //方法2
    int (*f)(int, int) { add };//函数指针直接指向加法函数
    int (*f2)(int, int) { subtract };//函数指针直接指向减法函数
    printf("Add result2: %d\n", (*f)(3, 4));
    printf("Subtract result2: %d\n", (*f2)(3, 4));

    return 0;
}

可以看到函数指针的灵活性和可复用性。
在这里插入图片描述

备注

c语言的运算符优先级:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年12月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;书架 John最近买了一个书架用来存放奶牛养殖书籍&#xff0c;但书架很快被存满了&#xff0c;只剩最顶层有空余。 John共有N头奶牛(1 ≤ N ≤ 20,000)&#xff0c;每头奶牛有自己的高度Hi(1 ≤ Hi ≤ 1…

智能安全帽定制_基于联发科MT6762平台的智能安全帽方案

智能安全帽是一种具备多项功能的高科技产品&#xff0c;其功能集成了视频通话监控、高清图像采集、无线数据传输、语音广播对讲、定位轨迹回放、静默报警、危险救援报警、脱帽报警、碰撞报警、近电报警以及智能调度系统等&#xff0c;同时还支持多功能模块的自由添加&#xff0…

7. UE5 RPG修改GAS的Attribute的值

前面几节文章介绍了如何在角色身上添加AbilitySystemComponent和AttributeSet。并且还实现了给AttributeSet添加自定义属性。接下来&#xff0c;实现一下如何去修改角色身上的Attribute的值。 实现拾取药瓶回血功能 首先创建一个继承于Actor的c类&#xff0c;actor是可以放置到…

银河麒麟操作系统 v10 中离线安装 Docker

银河麒麟操作系统 v10 中离线安装 Docker 1. 查看系统版本2. 查看 Linux 内核版本&#xff08;3.10以上&#xff09;3. 查看 iptabls 版本&#xff08;1.4以上&#xff09;4. 判断处理器架构5. 离线下载 Docker 安装包6. 移动解压出来的二进制文件到 /usr/bin 目录中7. 配置 Do…

课表排课小程序怎么制作?多少钱?

在当今的数字化时代&#xff0c;无论是购物、支付、点餐&#xff0c;还是工作、学习&#xff0c;都离不开各种各样的微信小程序。其中&#xff0c;课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢&#xff1f;又需要多少钱呢&#xff1f; …

网络端口映射和端口转发的区别和联系

目 录 一、端口映射技术 1.1 原理 1.2 应用场景 1、远程访问 2、游戏主机 3、文件共享 4、监控视频共享 二、端口转发技术 2.1 原理 2.2 应用场景 1、网络负载均衡 2、网络安全 3、网络代理 三、端口映射和转发的实现方法 3.1 路由器配置 3.2 网络防火墙 …

操作系统课程设计-Linux 进程间通信

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 步骤 3.2 关键代码 3.2.1 Server和Client的创建 3.2.2 Server核心代码 3.2.3 Server核心代码 4 实验结果与分析 5 代码 前言 本实验为课设内容&#xff0c;博客内容为部分报告内容&#xff0c;仅为大家提供参考&…

如何用Python进行数据分析(保姆级教程)

有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了&#xff0c;比较复杂。 很多网上的资料都是从语法教起的&#xff0c;花了很多时间还是云里雾里&#xff0c;摸不清方向。今天就给大家来捋一捋思路&#xff01;帮助大家提高学习效率&#xff01; Pyt…

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…

【Mybatis】延迟加载的原理是什么?

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 ​ 目录 前言 正文 MyBatis实现延迟加载的步骤&#xff1a; 生成代理对象&#xff1a; 触发时机&#xff1a; 执行查询&#xff1a; 填…

《169. 多数元素》C语言题解(力扣)(OJ题)

题目链接&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 个人力扣题解主页&#xff1a;我的题解…

K8s-架构

一、K8s节点划分 K8s集群包含Master(控制节点)和Node(工作节点)&#xff0c;应用部署在Node节点上。 集群架构图&#xff1a; 二、Master节点 Master节点分成四个组件&#xff1a;scheduler、ApiServer、Controller Manager、ETCD。类似三层结构&#xff0c;controller&#…

[自动化分布式] Zabbix自动发现与自动注册

abbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大 部署 添加zabb…

Firefox 100 正式发布

五月三日&#xff0c;Firefox发布了它的第100个版本&#xff0c;来回顾一下Firefox是如何走到今天这一步的&#xff0c;以及在第100个版本中发布了哪些功能。 回顾 2004年&#xff0c;《纽约时报》上宣布了Firefox 1.0的发布&#xff0c;这个广告列出了为第一版做出贡献的每一…

【MATLAB源码-第115期】基于matlab的QSM正交空间调制系统仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交空间调制&#xff08;QSM&#xff09;是一种先进的无线通信技术&#xff0c;它通过利用发射端的多天线阵列来传输信息&#xff0c;从而提高了数据传输的效率和速率。这种技术的关键在于它使用天线阵列的空间特性来编码额…

机器学习笔记——机器学习的分类

1 机器学习是啥 机器学习是人工智能的一个分支&#xff0c;它是一门研究机器获取新知识和新技能&#xff0c;并识别现有知识的学问。 机器学习已广泛应用于数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA 序列测…

交换机配置及网络测试

实验环境 拓扑图 Ip规划表 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-254 12 财务部 9 192.168.133.0 255.255.255…

Chatopera 云服务支持大语言模型对话(LLM),定制您的聊天机器人

2024 年&#xff0c;Chatopera 云服务继续不断完善&#xff0c;为开发者提供最好的定制聊天机器人的工具。在过去的一年&#xff0c;用户们反映最多的建议是 Chatopera 云服务内置大语言模型的对话&#xff0c;今天 Chatopera 云服务完成了产品升级&#xff0c;满足了这个诉求。…

NOIP2018提高组day2 - T1:旅行

题目链接 [NOIP2018 提高组] 旅行 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国&#xff0c;打算将各个城市都玩一遍。 小 Y 了解到&#xff0c;X 国的 n n n 个城市之间有 m m m 条双向道路。每条双向道路连接两个城市。 不存在两条连接同一对城市的道路&#xff…

跨站点请求伪造攻击 - Cross Site Request Forgery (CSRF)

什么是CSRF 最好理解CSRF攻击的方式是看一个具体的例子。 假设你的银行网站提供一个表单,允许当前登录用户将钱转账到另一个银行账户。例如,转账表单可能如下所示: <form method="post"action="/transfer"> <