当前位置: 首页 > article >正文

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中,指针函数函数指针 是两个容易混淆的概念,但它们的功能和用途完全不同。以下是详细的对比分析,帮助你彻底理解它们的区别。


1. 指针函数(Function Returning a Pointer)

定义
  • 指针函数 是一个返回值为指针类型的函数。
  • 它本质上是一个普通函数,只是其返回值是指向某种数据类型的指针。
语法
type* functionName(parameters);
  • type*:返回值类型是指针。
  • functionName:函数名。
  • parameters:函数的参数列表。
特点
  1. 返回值是一个指针。
  2. 可以通过返回的指针访问或修改内存中的数据。
  3. 常用于动态内存分配、字符串操作等场景。
示例
#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:函数的参数类型列表。
特点
  1. 存储的是函数的地址。
  2. 可以通过函数指针调用函数。
  3. 常用于回调函数、函数表、动态选择函数等场景。
示例
#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. 注意事项

  1. 指针函数

    • 确保返回的指针有效(避免返回局部变量的地址)。
    • 示例错误:
      char* getString() {char str[] = "Hello"; // 局部变量return str; // 错误:返回悬空指针
      }
      
  2. 函数指针

    • 确保函数指针与目标函数的签名匹配。
    • 示例错误:
      int add(int a, int b) { return a + b; }
      void (*funcPtr)() = add; // 错误:签名不匹配
      

6. 总结

  • 指针函数:一个返回指针的函数,重点在于返回值。
  • 函数指针:一个指向函数的指针变量,重点在于调用函数。

相关文章:

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中&#xff0c;指针函数 和 函数指针 是两个容易混淆的概念&#xff0c;但它们的功能和用途完全不同。以下是详细的对比分析&#xff0c;帮助你彻底理解它们的区别。 1. 指针函数&#xff08;Function Returning a Pointer&#xff09; 定义 指针函数 是一个返回值为…...

软考中级-软件设计师 知识点速过1(手写笔记)

第一章&#xff1a;数值及其转换 没什么可说的&#xff0c;包括二进制转八进制和十六进制 第二章&#xff1a;计算机内部数据表示 真值和机器数&#xff1a; 原码&#xff08;后面都拿x -19举例) &#xff1a; 反码&#xff1a; 补码&#xff1a; 移码&#xff1a; 定点数…...

【美化vim】

美化vim 涉及文件一个例子 涉及文件 ~/.vimrc修改这个文件即可 一个例子 let mapleader ,set number " 显示行号"set relativenumber " 显示相对行号set incsearch " 实时开启搜索高亮set hlsearch " 搜索结果高亮set autoinden…...

Dash框架深度解析:数据驱动型Web应用的Python化革命

一、Dash的定位与技术基因 Dash作为Python生态中的现象级框架,重新定义了数据科学家与Web应用开发之间的边界。它以**“零前端”**为核心设计理念,将React的组件化思想、Plotly的可视化能力与Flask的轻量化服务完美融合,使得Python开发者无需深入JavaScript技术栈即可构建交…...

Linux——线程(1)线程概念与控制

线程&#xff1f;这个名字我们似乎有些眼熟&#xff1f;没错&#xff0c;我们之前提到过的进程和这个有点像。但进程和线程有什么关系呢&#xff1f;本系列我们讲从线程的概念出发&#xff0c;了解一下Linux中的线程以及线程和进程的关系等内容。 一、线程的概念 线程是一个执…...

Redis LFU 策略参数配置指南

一、基础配置步骤‌ 设置内存上限‌ 在 redis.conf 配置文件中添加以下指令&#xff0c;限制 Redis 最大内存使用量&#xff08;例如设置为 4GB&#xff09;&#xff1a; maxmemory 4gb选择 LFU 淘汰策略‌ 根据键的作用域选择策略&#xff1a; # 所有键参与淘汰 maxmemory-…...

备忘录模式:实现对象状态撤销与恢复的设计模式

备忘录模式&#xff1a;实现对象状态撤销与恢复的设计模式 一、模式核心&#xff1a;在不破坏封装性的前提下保存和恢复对象状态 在软件开发中&#xff0c;经常需要实现 “撤销” 功能&#xff08;如文本编辑器的撤销修改、游戏存档读取&#xff09;。直接暴露对象内部状态会…...

蓝桥杯 5. 交换瓶子

交换瓶子 原题目链接 题目描述 有 N 个瓶子&#xff0c;编号为 1 ~ N&#xff0c;放在架子上。 例如有 5 个瓶子&#xff0c;当前排列为&#xff1a; 2 1 3 5 4每次可以拿起 2 个瓶子&#xff0c;交换它们的位置。 要求通过若干次交换&#xff0c;使得瓶子的编号从小到大…...

本地使用Ollama部署DeepSeek

以下是在本地使用Ollama部署DeepSeek的详细教程&#xff0c;涵盖安装、修改安装目录、安装大模型以及删除大模型的操作步骤。 安装Ollama 1. 系统要求 确保你的系统满足以下条件&#xff1a; 操作系统&#xff1a;macOS、Linux或者Windows。足够的磁盘空间和内存。 2. 安装…...

freecad参数化三维模型装配体解析至web端,切换参数组或修改参数

用免费开源的freecad制作全参数化的三维模型&#xff0c;并且装配&#xff0c;上传至服务器&#xff0c;解析至web端&#xff0c;用户可以切换参数或修改参数&#xff0c;驱动模型改变。 freecad全参数化装配体模型解析至web端进行参数切换、修改完整展示_哔哩哔哩_bilibili …...

前端基础之《Vue(9)—混入》

一、什么是混入 1、是一种代码复用的技巧 Vue组件是由若干选项组成的&#xff0c;向组件中混入可复用的选项。 2、作用 比如我封装两个组件&#xff0c;一个是A组件&#xff0c;一个是B组件&#xff0c;发现它里面有相同的选项&#xff0c;就可以用混用的方式来复用它。 二、…...

ORACLE DATAGUARD遇到GAP增量恢复方式修复RAC环境备机的实践

ORACLE DATAGUARD技术是一个常用的数据保护机制&#xff0c;在DATAGUARD运行过程中&#xff0c;遇到异常导致备机不同步&#xff0c;而主库的归档日志也被清理&#xff0c;此时出现GAP&#xff0c;无法同步&#xff1b;就需要人工处理&#xff1b;对于小型数据库重新全量同步数…...

机器人进阶---视觉算法(六)傅里叶变换在图像处理中怎么用

傅里叶变换在图像处理中怎么用 傅里叶变换的基本原理应用场景Python代码示例逐行解释总结傅里叶变换在图像处理中是一种重要的工具,它将图像从空间域转换到频域,从而可以对图像的频率特性进行分析和处理。傅里叶变换在图像滤波、图像增强、图像压缩和图像分析等方面都有广泛应…...

Java知识日常巩固(五)

Java中wait()和 sleep()的区别? 在Java中,wait()和sleep()方法用于线程控制,但它们之间存在几个关键区别: 1. 用途 wait():用于线程间的协作。当一个线程需要等待某个条件满足时,它会调用wait()方法释放锁并进入等待状态,直到其他线程调用相同对象的notify()或notifyAl…...

浅析锁的应用与场景

锁的应用与场景&#xff1a;从单机到分布式 摘要&#xff1a;在多线程和分布式系统中&#xff0c;“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗&#xff1f;什么时候该用锁&#xff1f;用哪种锁&#xff1f;本文通过通俗的比喻和代码示例&#xff0c;带…...

语音合成之五语音合成中的“一对多”问题主流模型解决方案分析

语音合成中的“一对多”问题主流模型解决方案分析 引言“一对多”指的是什么&#xff1f;优秀开源模型的方法CosyvoiceSparkTTSLlaSA TTSVITS 引言 TTS系统旨在模仿人类的自然语音&#xff0c;但其核心面临着一个固有的挑战&#xff0c;即“一对多”问题 。这意味着对于给定的…...

ElementUi的Dropdown下拉菜单的详细介绍及使用

Dropdown是 ElementUI 中用于创建下拉菜单项的一个组件&#xff0c;通常el-dropdown-item 包裹在 el-dropdown 组件中使用。以下从功能特性(一些属性及方法)、使用和高级功能(高亮显示&#xff0c;滚动&#xff0c;额外传参数)三个方面进行详细介绍。 一、功能特性 1.触发方式…...

Linux麒麟 V10 系统找回 root 密码的步骤

Linux麒麟 V10 系统找回 root 密码的步骤 1 环境介绍2 操作步骤2.1重启系统并进入 GRUB 菜单2.2 输入 GRUB 账户密码2.3 修改启动参数2.4 启动系统2.5 修改root 密码2.6 重启系统 3 Linux命令全方位指南实战教程Linux命令学习使用列表 1 环境介绍 有时候root 密码忘记&#xf…...

20、 DeepSeekMoE论文笔记

DeepSeekMoE 1、**研究背景与动机**2、传统MoE一、MoE架构核心原理详解1. **标准Transformer块的结构**2. **MoE层对FFN的替代**3. **稀疏性与计算效率** 二、举例说明&#xff1a;以 N 4 N4 N4 专家、 K 2 K2 K2 为例1. **场景设定**2. **亲和度计算与专家选择**3. **输出计…...

在 Spring Boot 中实现 WebSockets

什么是 WebSockets&#xff1f; WebSockets 是一种基于 TCP 的全双工通信协议&#xff0c;允许客户端和服务器之间建立持久的双向连接&#xff0c;用于实时数据交换。相较于传统的 HTTP 请求-响应模型&#xff0c;WebSockets 提供了低延迟、高效率的通信方式&#xff0c;特别适…...

stone 3d v3.3.0版本发布,含时间线和连接器等新功能

1.新加了时间线&#xff08;timeline&#xff09;编辑器&#xff0c;可以类似blender一样给对象制作动画 2.新加了度量&#xff08;metrics&#xff09;系统&#xff0c;通过scene对象检测器中的useMetrics属性来启用或禁用&#xff0c;启用时所选物体将显示三维度量数据 新加了…...

.whl文件

本文主要介绍了.whl文件的定义&#xff0c;怎么安装.whl文件&#xff08;离线&#xff0c;在线&#xff09;。 怎么查看cuda的版本&#xff0c;以及如何安装相应版本的cuda&#xff08;本地电脑&#xff0c;超算上&#xff09; 以及如何创建.whl文件 .whl文件的定义 Document…...

Git命令行中vim的操作

Git命令行用vim打开文件&#xff0c;或者用其他git命令打开了文件&#xff0c;需要编辑和保存文件等&#xff0c;有些命令表情奇怪&#xff0c;往往容易忘记这些命令。记录下。 下面这篇比较实用和简练&#xff1a; gitvim编辑文件命令 • Worktile社区https://worktile.com/…...

C#初级知识总结

一、什么是CIL 1.CIL(Common Intermidate Language)是指.Net的公共中间语言&#xff0c;它是一种编程语言。 .Net框架的各种语言在编译时都会编译成同一种中间语言&#xff08;CIL&#xff09;&#xff0c;之后程序运行的时候CIL会被JIT(Just In Time)转换为二进制语言&#xf…...

使用 AI Agent 改善师生互动的设计文档

使用 AI Agent 改善师生互动的设计文档 一、引言 1.1 研究背景 当前教育领域的师生互动存在诸多挑战&#xff0c;如教师负担过重、学生个体差异大导致难以满足所有人的需求&#xff0c;以及信息传递延迟等问题。引入AI-Agent能够有效缓解这些问题&#xff0c;通过自动化手段协…...

Linux学习笔记之环境变量

写这篇博客的目的主要是因为本人学习动静态库时&#xff0c;用到了环境变量的知识&#xff0c;发现略有遗忘&#xff0c;因此回顾复习&#xff0c;整理成博客。 一、环境变量是什么 Linux环境变量是存储系统或程序运行时配置信息的特殊变量&#xff0c;用于为程序提供配置参数…...

16:00开始面试,16:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到4月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

深度解析云计算:概念、优势与分类全览

以下是对云计算概念、优点和分类更详细的介绍&#xff1a; 一、云计算的概念 云计算是一种通过互联网提供计算服务的模式&#xff0c;它基于虚拟化、分布式计算、网络存储等一系列先进技术&#xff0c;将计算资源进行整合和管理&#xff0c;形成一个庞大的资源池。这些资源包…...

私钥连接服务器(已经有服务器私钥

前言&#xff1a;假设我们已经有了服务器的私钥&#xff0c;我们怎么配置呢&#xff1f; 下面我会从vsc的配置角度来写 ✅ 步骤一&#xff1a;准备工作 安装 VS Code&#xff08;如果还没装&#xff09; &#x1f449; https://code.visualstudio.com/ 安装插件&#xff1a;Re…...

学员答题pk知识竞赛小程序怎么做

制作学员答题PK知识竞赛小程序&#xff0c;主要有以下步骤&#xff1a; 一、规划设计 明确需求&#xff1a;确定小程序的使用场景是校园知识竞赛、培训机构考核还是企业内部培训等。答题功能&#xff0c;规定答题的具体规则&#xff0c;包括题目类型&#xff08;单选、多选、…...