C语言高频面试题——指针函数和函数指针的区别
在 C 语言中,指针函数 和 函数指针 是两个容易混淆的概念,但它们的功能和用途完全不同。以下是详细的对比分析,帮助你彻底理解它们的区别。
1. 指针函数(Function Returning a Pointer)
定义
- 指针函数 是一个返回值为指针类型的函数。
- 它本质上是一个普通函数,只是其返回值是指向某种数据类型的指针。
语法
type* functionName(parameters);
type*
:返回值类型是指针。functionName
:函数名。parameters
:函数的参数列表。
特点
- 返回值是一个指针。
- 可以通过返回的指针访问或修改内存中的数据。
- 常用于动态内存分配、字符串操作等场景。
示例
#include <stdio.h>// 指针函数:返回一个指向整型的指针
int* getMaxPointer(int* a, int* b) {return (*a > *b) ? a : b;
}int main() {int x = 10, y = 20;int* ptr = getMaxPointer(&x, &y); // 返回指向较大值的指针printf("Max value: %d\n", *ptr); // 输出 20return 0;
}
使用场景
- 动态分配内存并返回指针:
int* allocateMemory(int size) {return malloc(size * sizeof(int)); }
- 返回数组或字符串的一部分:
char* getSubstring(char* str, int start, int len) {char* result = malloc(len + 1);strncpy(result, str + start, len);result[len] = '\0';return result; }
2. 函数指针(Pointer to Function)
定义
- 函数指针 是一个指向函数的指针变量。
- 它存储的是函数的入口地址,可以通过函数指针调用对应的函数。
语法
return_type (*pointer_name)(parameter_types);
return_type
:函数的返回值类型。(*pointer_name)
:函数指针的名称。parameter_types
:函数的参数类型列表。
特点
- 存储的是函数的地址。
- 可以通过函数指针调用函数。
- 常用于回调函数、函数表、动态选择函数等场景。
示例
#include <stdio.h>// 两个简单的函数
int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {// 定义函数指针int (*operation)(int, int);// 将函数指针指向不同的函数operation = add;printf("Add: %d\n", operation(5, 3)); // 输出 8operation = subtract;printf("Subtract: %d\n", operation(5, 3)); // 输出 2return 0;
}
使用场景
- 回调函数:
void execute(int (*callback)(int, int), int a, int b) {printf("Result: %d\n", callback(a, b)); }int multiply(int a, int b) {return a * b; }int main() {execute(multiply, 4, 5); // 输出 20return 0; }
- 函数表(如状态机实现):
int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; }int main() {int (*operations[2])(int, int) = {add, subtract};printf("Add: %d\n", operations[0](5, 3)); // 输出 8printf("Subtract: %d\n", operations[1](5, 3)); // 输出 2return 0; }
3. 核心区别总结
特性 | 指针函数 | 函数指针 |
---|---|---|
定义 | 返回值为指针的函数 | 指向函数的指针变量 |
语法 | type* functionName(parameters) | return_type (*pointer_name)(parameters) |
本质 | 普通函数,返回指针 | 存储函数地址,用于调用函数 |
使用场景 | 动态内存分配、返回复杂数据结构 | 回调函数、函数表、动态选择函数 |
示例 | int* getMaxPointer(int* a, int* b) | int (*operation)(int, int); |
4. 示例对比
指针函数
char* getString() {static char str[] = "Hello, World!";return str;
}int main() {char* message = getString();printf("%s\n", message); // 输出 "Hello, World!"return 0;
}
函数指针
void greet() {printf("Hello!\n");
}int main() {void (*funcPtr)() = greet; // 函数指针指向 greetfuncPtr(); // 调用 greet 函数return 0;
}
5. 注意事项
-
指针函数:
- 确保返回的指针有效(避免返回局部变量的地址)。
- 示例错误:
char* getString() {char str[] = "Hello"; // 局部变量return str; // 错误:返回悬空指针 }
-
函数指针:
- 确保函数指针与目标函数的签名匹配。
- 示例错误:
int add(int a, int b) { return a + b; } void (*funcPtr)() = add; // 错误:签名不匹配
6. 总结
- 指针函数:一个返回指针的函数,重点在于返回值。
- 函数指针:一个指向函数的指针变量,重点在于调用函数。
相关文章:
C语言高频面试题——指针函数和函数指针的区别
在 C 语言中,指针函数 和 函数指针 是两个容易混淆的概念,但它们的功能和用途完全不同。以下是详细的对比分析,帮助你彻底理解它们的区别。 1. 指针函数(Function Returning a Pointer) 定义 指针函数 是一个返回值为…...
MQTTClient_message 源码深度解析与架构设计
一、结构体内存布局与版本控制机制 #mermaid-svg-i9W8883mELYm6HUj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i9W8883mELYm6HUj .error-icon{fill:#552222;}#mermaid-svg-i9W8883mELYm6HUj .error-text{fill:#…...
4.21—4.22学习总结 JavaWeb:HTML-CSS
Web:能够通过浏览器访问到的网站。 Web标准: HTML: vscode中进行注释的快捷键为ctrl斜线/ h1的字体最大,依次递减,只存在h1—h6。 超链接: 设置字体颜色: 方式三写一个css文件,将方…...
STM32的定时器输出PWM时,死区时间(DTR)如何计算
在 STM32F429(以及所有 STM32F4 “高级定时器”)中,死区时间由 TIMx_BDTR 寄存器的 8 位 “Dead‑Time Generator” 字段 DTG[7:0] 来配置。其计算分三步: 计算死区时钟周期 tDTS TIM1 时钟源为 APB2 定时器时钟(PCL…...
4.LinkedList的模拟实现:
LinkedList的底层是一个不带头的双向链表。 不带头双向链表中的每一个节点有三个域:值域,上一个节点的域,下一个节点的域。 不带头双向链表的实现: public class Mylinkdelist{//定义一个内部类(节点)stat…...
使用PyTorch构建神经网络笔记
专有名词 Batch Size 在深度学习中,批大小(Batch Size) 是指每次前向传播和反向传播时使用的样本数量。它是训练神经网络时的一个关键超参数,直接影响训练速度、内存占用和模型性能。 (1) 计算梯度 在训练时,模型通过…...
麒麟系统网络连接问题排查
麒麟系统网络连接有红色叹号,不能上外网 了。 首先执行 ping -c4 8.8.8.8 和 nc -zv 8.8.8.8 53,如果 都能正常通信,说明你的网络可以访问公共 DNS 服务器(如 Google DNS 8.8.8.8),但域名解析仍然失败,可能是 DNS 解析配置问题 或 系统 DNS 缓存/代理干扰。以下是进一步…...
python高级特性01
装饰器 基本语法 在不改变原函数的基础上,新增/修改一些功能 在被装饰函数/类前使用:decorator_name 装饰器接收一个函数返回一个新函数 def decorator_name(func):# 装饰器的操作...def wrapper(*args, **kwargs):# 前置操作...result func()# 后置…...
shared_ptr八股收集 C++
(1)、具体讲一下shared_ptr自动管理内存的原理/引用计数的具体原理/shared_ptr引用计数什么时候会增加,什么时候会减少? 在shared_ptr的内部维护了⼀个计数器,来跟踪有多少个shared_ptr对象指向了某⼀个资源。当计数器…...
【gpt生成-其二】以go语言为例,详细讲解 并发模型:线程/协程/ Actor 实现
Go语言并发模型详解:线程、协程与Actor实现 1. 线程模型 概念 线程是操作系统调度的最小单位,每个线程拥有独立的栈和寄存器上下文,但共享进程的内存空间。线程的创建、切换和同步需要较高的系统开销。 Go中的实现…...
nodejs创建文件
环境要求:nodejs 运行命令: node createComponent.js各文件内容: createComponent.js /** 功能概述:* 1. 通过命令行交互,用户输入组件名称,选择模板类型。* 2. 根据用户输入生成对应的Vue组件、Service…...
三餐四季、灯火阑珊
2025年4月22日,15~28℃,挺好的 待办: 教学技能大赛教案(2025年4月24日,校赛,小组合作,其他成员给力,暂不影响校赛进度,搁置) 教学技能大赛PPT(202…...
HTTP状态码有哪些常见的类型?
HTTP 状态码用于表示服务器对客户端请求的响应状态,常见的 HTTP 状态码可以分为以下几类: 一、1xx:信息提示 状态码以 1 开头,表示请求已接收,客户端应继续其请求。常见的状态码有: • 100 Continue&…...
01-STM32基本知识点和keil5的安装
一、微控制器: 1、微控制器也被称为MCU(国内称为单片机),微控制器集成了处理器、内存、输入/输出接口等多种功能模块,能够独立完成特定的控制任务。它主要用于对设备或系统的控制和监测,MCU通常是一个高度…...
前端如何优雅地对接后端
作为一名前端开发者,与后端对接是我们日常工作中不可避免的一部分。从API设计的理解到错误处理的优雅实现,前端需要的不只是调用接口的代码,更是一种协作的艺术。本文将从Vue 3项目出发,分享如何与后端高效协作,减少联…...
Centos虚拟机远程连接缓慢
文章目录 Centos虚拟机远程连接缓慢1. 问题:SSH远程连接卡顿现象2. 原因:SSH服务端DNS检测机制3. 解决方案:禁用DNS检测与性能调优3.1 核心修复步骤3.2 辅助优化措施 4. 扩展认识:SSH协议的核心机制4.1 SSH工作原理4.2 关键配置文…...
Centos 、Linux 基础运维命令
查看系统IP ifconfig 巡检常用 显示磁盘空间使用情况 df -h 配置主机名查称看主机名称 hostname 修改主机名称 打开修改的配置文件 vim /etc/sysconfig/network 防火墙 查看防火墙状态 service iptables status 临时关闭防火墙:关机重启后防火墙还会开启 …...
算力网络有关论文自用笔记(2)
MADRLOM: A Computation offloading mechanism for software-defined cloud-edge computing power network 本质上还是计算卸载,概念套壳 主要工作 一种由软件定义的云边缘计算电力网络体系结构,包括多个用户设备、多个边缘节点和一个云数据中心。用户…...
基于外部中中断机制,实现以下功能: 1.按键1,按下和释放后,点亮LED 2.按键2,按下和释放后,熄灭LED 3.按键3,按下和释放后,使得LED闪烁
题目: 参照外部中断的原理和代码示例,再结合之前已经实现的按键切换LED状态的实验,用外部中断改进其实现。 请自行参考文档《中断》当中,有关按键切换LED状态的内容, 自行连接电路图,基于外部中断机制,实现以下功能&am…...
Go语言和Python 3的协程对比
Go语言和Python 3都支持协程(concurrent coroutines),但它们的实现机制、使用方式、调度方式和性能表现差异很大。下面是对比分析: 一、基本概念对比 特性Go 协程(goroutine)Python3 协程(asyn…...
量子计算在密码学中的应用与挑战:重塑信息安全的未来
在当今数字化时代,信息安全已成为全球关注的焦点。随着量子计算技术的飞速发展,密码学领域正面临着前所未有的机遇与挑战。量子计算的强大计算能力为密码学带来了新的应用场景,同时也对传统密码体系构成了潜在威胁。本文将深入探讨量子计算在…...
java知识点
一、ArrayList 的扩容 1.ArrayList 的扩容机制是将新容量计算为原容量的 15倍,即 oldcapacity(oldcapacity >>1)。这个操作将新容量设置为当前容量的 1.5 倍。 2.在 ArrayList 扩容时,会使用 Arrays.copyof()方法来复制原数组中的元素到新数组中&a…...
工厂模式:工厂方法模式 和 抽象工厂模式
工厂方法模式:优化,工厂类也分子类和父类 流程: 实例: #include <iostream> using namespace std; /*抽象产品类 TV(电视机类)*/ class TV { public: virtual void Show() 0; virtual ~TV();//声明析构函数为虚函数&…...
遨游通讯发布国产化旗舰三防手机AORO AU1:以自主可控重塑工业安全
在全球产业链加速重构的背景下,国产化技术突破已成为工业领域高质量发展的核心驱动力。作为专精特新中小企业,遨游通讯始终以“让世界更安全、更高效、更简单”为使命,深耕“危、急、特”场景智能通信设备的研发。近日,遨游通讯正…...
全波暗室和半波暗室的区别
什么是微波暗室?其作用是什么: 微波暗室又叫吸波室、电波暗室,一般是指由吸波材料和金属屏蔽体组成的特殊房间,该房间可有效防止电磁波的多次反射、隔绝外界电磁波的干扰,提供一个稳定的电磁环境,(高级点的…...
Qt 下载的地址集合
Qt 下载离线安装包 download.qt.io/archive/qt/5.14/5.14.2/ Qt 6 安装下载在线安装包 Index of /qt/official_releases/online_installers/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
08_Docker Portainer可视化管理
简介: Portainer 是一个轻量级的、基于 Web 的 Docker 管理用户界面。它允许用户轻松管理 Docker 环境,包括 Docker 主机、容器、镜像、网络等。 多主机管理,Portainer 支持通过 agent 的方式管理多台 Docker 主机。无论是企业级大规模的 D…...
【产品经理从0到1】用户研究和需求分析
用户角色 定义 用户角色 user personal,从用户群体中抽象出来的典型用户,一般 会包含: 1、个人基本信息; 2、家庭、工作、生活环境描述; 3、与产品使用相关的具体情境,用户目标或产品使用行为描述等。 特…...
神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)
引言 在神经网络的发展历程中,梯度消失和梯度爆炸如同两座难以翻越的大山,阻碍着深层神经网络发挥其强大的潜力。尤其是在处理复杂任务时,这两个问题可能导致模型训练陷入困境,无法达到预期的效果。本文将深入探讨梯度消失和梯度…...
深入理解无监督学习:探索数据的潜在结构
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4o-mini模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
Java实例化对象都有几种方式
在 Java 中,实例化对象的方式有多种,具体取决于场景需求和设计模式。以下是 7 种核心对象实例化方式及其原理、适用场景与代码示例: 1. new 关键字(直接构造) 原理:通过调用类的构造函数直接创建…...
数据结构:顺序表的实现
顺序表是用一段物理地址连续的存储单元依次储存数据的线性结构,一般情况下采用数组储存,在数组上完成数据的增删减改。 这里我们定义一个MyArrayList类,用来实现顺序表的功能: public class MyArrayList{int[] array;int usedsi…...
# 06_Elastic Stack 从入门到实践(六)
06_Elastic Stack 从入门到实践(六) 一、课程介绍 1、课程介绍 2、Nginx日志分析系统 3、Filebeat入门学习 4、Metricbeat入门学习 5、Kibana入门学习 6、Logstash入门学习 7、综合练习 二、Nginx 日志分析系统需求分析 1、业务需求 Nginx是一款非常优秀的web服务…...
[Android]豆包爱学v4.5.0小学到研究生 题目Ai解析
拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学,一般又称河马爱学教育平台app,河马爱学。 关于学习,你可能也需要一个“豆包爱学”这样的AI伙伴,它将为你提供全方位的学习帮助…...
重装系统后的自用包
装驱动 sudo apt update sudo apt upgrade sudo apt install nvidia-driver-535搜狗输入法: https://shurufa.sogou.com/linux/guideClash verge: ubuntu20 下载1.7.7版本的 https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/v1.7.7…...
4.22tx视频后台开发一面
总时长大概在一个小时,主要提问C、操作系统、计网以及数据库等方面,最后两个算法编程题。 一上来先介绍项目 Linux下的mybash命令处理器和内存池 mybash可以再总结归纳一下,一上来有点紧张没有条理 内存池是用边界标识法写的,…...
如何Ubuntu 22.04.5 LTS 64 位 操作系统部署运行SLAM3! 详细流程
以下是在本地部署运行 ORB-SLAM3 的详细步骤,基于官方 README.md 和最佳实践整理,适用于 Ubuntu 16.04/18.04/20.04/22.04 系统: 一、系统要求与依赖项安装 1. 基础系统要求 操作系统:Ubuntu 16.04/18.04/20.04/22.04ÿ…...
Ubuntu 上安装 Conda
在 Ubuntu 上安装 Conda(Anaconda 或 Miniconda)的完整步骤如下: --- **方法1:安装 Miniconda(推荐)** Miniconda 是 Anaconda 的精简版,只包含基本组件。 **1. 下载安装脚本** bash # 下载最…...
初级云计算运维工程师学习二
全面解析云计算服务模式:公有云、私有云、混合云及IaaS/PaaS/SaaS/DaaS 云计算部署模式:三种主要形式 1. 公有云(Public Cloud) 定义:云端资源开放给社会公众使用,由第三方云服务提供商通过互联网交付。 …...
物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键
在当今数字化时代,物联网(IoT)正以前所未有的速度蓬勃发展,其影响力已广泛渗透到各个领域,楼宇自控技术便是其中之一。从本质上讲,楼宇自控旨在实现对建筑物内各类机电设备的智能化管理与控制,为…...
数字孪生技术:企业数字化转型的助推器
在当今环境下,企业面临的挑战不断增加。从可持续发展目标的要求到员工数字技能的提升,转型的呼声越来越高。然而,即使是经验丰富的领导者,也很难在这种前所未有的商业环境下实现转型。企业如何在满足可持续发展目标的同时保持盈利…...
ESM 内功心法:化解 require 中的夺命一击!
前言 传闻在JavaScript与TypeScript武林中,曾有两大绝世心法:CommonJS与ESM。两派高手比肩而立,各自称霸一方,江湖一度风平浪静。 岂料,时局突变。ESM逐步修成阳春白雪之姿,登堂入室,成为主流正统。CommonJS则渐入下风,功力不济,逐渐退出主舞台。 话说某日,一位前…...
安全调度系统:安全管理的智能中枢
安全调度系统作为安全管理体系的核心枢纽,正在深刻改变着传统安全管理的模式和效能。这个集成了先进信息技术的智能化平台,通过实时监控、智能分析和快速响应三大核心功能,构建起全方位、多层次的安全防护网络,成为各类场所安全管…...
Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术
1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...
jsconfig.json文件的作用
jsconfig.json文件的作用 为什么今天会谈到这个呢?有这么一个场景:我们每次开发项目时都会给路径配置别名,配完别名之后可以简化我们的开发,但是随之而来的就有一个问题,一般来说,当我们使用相对路径时…...
Python线程全面详解:从基础概念到高级应用
一、线程基础概念 1.1 进程与线程的关系 进程是操作系统资源分配的基本单位,它是程序的一次执行过程。当我们将程序加载到内存中运行时,系统会为它分配CPU、内存、文件句柄等资源,这时就形成了一个进程。 线程是CPU调度的基本单位…...
学习模拟电路
学习模拟电路需要掌握以下几个关键领域的知识和技能,涵盖基础理论、器件特性、电路设计、分析工具以及实践应用: 1. 基础理论与概念 电路基本定律:欧姆定律、基尔霍夫电压定律(KVL)和电流定律(KCL…...
解码思维链:AI思维链如何重塑人类与机器的对话逻辑
第一章:思维链的诞生与进化 1.1 从"猜谜游戏"到"推理革命" 传统AI模型如同蒙眼解题的考生:当被问及"玛丽有12块饼干,吃掉4块后剩下多少",它们擅长预测答案,却无法展示"12-48&quo…...
css3新特性第六章(2D变换)
css3新特性第五章(2D变换) CSS3 转换可以对元素进行移动、缩放、转动、拉长或拉伸。 2D位移2D缩放2D旋转2D扭曲多重变换变换原点 一、2D位移 2D 位移可以改变元素的位置,具体使用方式如下: 先给元素添加 转换属性 transform 编写 transform 的具体值&…...
L2-2、示范教学与角色扮演:激发模型“模仿力“与“人格“
一、Few-shot 教学的核心原理与优势 在与大语言模型交互时,Few-shot(少样本)教学是一种强大的提示技术。其核心原理是通过提供少量示例,引导模型理解我们期望的输出格式和内容风格。 Few-shot 教学的主要优势包括: …...