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

【C 语言系统入门教程】第 14 讲:深入理解指针 (4) | 零基础学习笔记

【C 语言系统入门教程】第 14 讲深入理解指针 (4) | 零基础学习笔记前言本讲是指针进阶收官篇聚焦字符指针、数组指针、二维数组传参、函数指针、函数指针数组、转移表六大高阶指针知识点彻底打通 C 语言指针的最后壁垒是理解复杂指针、底层编程、函数回调的核心一课。系列往期笔记第 1 讲C 语言常见概念第 2 讲C 语言数据类型和变量第 3 讲分支和循环上第 4 讲分支和循环下第 5 讲数组第 6 讲函数第 7 讲数组和函数实践扫雷游戏第 8 讲VS 实用调试技巧第 10 讲操作符详解第 11 讲深入理解指针 (1)第 12 讲深入理解指针 (2)第 13 讲深入理解指针 (3) 本讲学习目标掌握字符指针的两种用法理解常量字符串存储特性。区分指针数组与数组指针掌握数组指针的定义与使用。吃透二维数组传参的本质掌握形参的两种写法。掌握函数指针的定义、赋值与调用。学会用typedef重命名复杂指针类型。掌握函数指针数组的定义与使用场景。理解转移表思想用函数指针数组简化多分支代码。 核心学习内容1. 字符指针变量字符指针char*除指向单个字符外还可指向常量字符串首字符地址。1.1 两种使用方式// 1. 指向单个字符 char ch w; char* pc ch; // 2. 指向常量字符串存首字符地址 const char* pstr hello bit.;核心const char* pstr hello bit.不是把字符串存入指针而是把字符串首字符地址存入pstr。1.2 常量字符串笔试题#include stdio.h int main() { char str1[] hello bit.; char str2[] hello bit.; const char *str3 hello bit.; const char *str4 hello bit.; ​ if(str1 str2) printf(str1 and str2 are same\n); else printf(str1 and str2 are not same\n); ​ if(str3 str4) printf(str3 and str4 are same\n); else printf(str3 and str4 are not same\n); return 0; }结果str1 and str2 are not same str3 and str4 are same原因数组初始化会开辟独立内存str1、str2 地址不同。常量字符串存放在只读内存区str3、str4 指向同一块地址。字符数组与字符指针存储对比图​2. 数组指针变量2.1 数组指针 vs 指针数组写法类型含义int* p[10]指针数组数组存放 10 个int*指针int (*p)[10]数组指针指针指向含 10 个 int 的数组核心[]优先级高于*加()保证先与*结合。2.2 数组指针定义与初始化数组指针用于存放整个数组的地址数组名。int arr[10] {0}; // 数组指针指向int[10]类型的数组 int (*p)[10] arr;类型解析int (*p)[10]p数组指针变量名*说明是指针[10]指向的数组包含 10 个元素int数组元素类型数组指针指向数组​3. 二维数组传参的本质核心结论二维数组名是第一行一维数组的地址类型为int (*)[5]数组指针。3.1 形参两种写法// 写法1二维数组形式 void test(int a[3][5], int r, int c); ​ // 写法2数组指针形式本质 void test(int (*p)[5], int r, int c);3.2 数组指针访问二维数组#include stdio.h void test(int (*p)[5], int r, int c) { int i 0, j 0; for(i0; ir; i) { for(j0; jc; j) { // *(*(pi)j) 等价于 p[i][j] printf(%d , *(*(pi)j)); } printf(\n); } } int main() { int arr[3][5] {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; test(arr, 3, 5); return 0; }4. 函数指针变量4.1 函数地址函数名 函数名都是函数的地址。#include stdio.h void test() { printf(hehe\n); } int main() { printf(%p\n, test); // 函数地址 printf(%p\n, test); // 函数地址 return 0; }4.2 函数指针定义// 函数 int Add(int x, int y) { return xy; } // 函数指针指向返回int、参数(int,int)的函数 int (*pf)(int, int) Add;类型解析int (*pf)(int, int)pf函数指针变量名*说明是指针(int,int)函数参数类型int函数返回值类型4.3 函数指针调用// 两种调用方式等价 printf(%d\n, (*pf)(2,3)); printf(%d\n, pf(2,3));4.4 typedef 重命名函数指针简化复杂函数指针类型// 重命名 void(*)(int) 为 pfun_t typedef void(*pfun_t)(int); pfun_t signal(int, pfun_t);5. 函数指针数组定义存放函数指针的数组要求数组中函数的返回值、参数完全一致。// 函数指针数组存放4个运算函数 int (*p[5])(int, int) {0, add, sub, mul, div};解析p先与[5]结合是数组数组元素类型int (*)(int,int)函数指针6. 转移表转移表用函数指针数组替代switch-case简化多分支函数调用。6.1 计算器转移表实现#include stdio.h // 1. 将 div 改名为 my_div 避免标准库冲突 int add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int my_div(int a, int b) { return a / b; } int main() { int x, y, input 1, ret 0; // 函数指针数组转移表 (对应 0:占位, 1:add, 2:sub, 3:mul, 4:div) int (*p[5])(int, int) {0, add, sub, mul, my_div}; while (input) { printf(1:add 2:sub\n3:mul 4:div\n0:exit\n请选择:); // 4. 增加 scanf 返回值检查防止非数字输入导致死循环 if (scanf(%d, input) ! 1) { // 清空输入缓冲区 while(getchar() ! \n); printf(输入无效请输入数字\n\n); continue; } if (input 1 input 4) { printf(输入操作数:); if (scanf(%d%d, x, y) ! 2) { while(getchar() ! \n); printf(输入无效请输入两个整数\n\n); continue; } // 3. 除法前增加除零检查 if (input 4 y 0) { printf(错误除数不能为零\n\n); continue; } // 2. 修正函数调用参数 ret p[input](sslocal://flow/file_open?urlx%2Cyflow_extraeyJsaW5rX3R5cGUiOiJjb2RlX2ludGVycHJldGVyIn0); printf(ret%d\n\n, ret); } else if (input 0) { printf(退出计算器\n); } else { printf(选择错误\n\n); } } return 0; }转移表函数调用示意图​ 课后习题一、选择题const char* p abcp 存储的是A. 字符串全部内容B. 首字符地址C. 字符串长度D. 数组地址int (*p)[10]是A. 指针数组B. 数组指针C. 函数指针D. 整型数组二维数组传参形参本质是A. 二维数组B. 一级指针C. 数组指针D. 函数指针函数指针int (*pf)(int,int)指向的函数是A. 返回 int参数两个 intB. 返回指针参数 intC. 返回数组参数 intD. 无返回值参数 int函数指针数组的核心用途是A. 存储整型数据B. 转移表简化分支C. 指向字符D. 模拟二维数组二、判断题两个字符指针指向同一个常量字符串地址相同。int* p[5]是数组指针。二维数组名是第一行一维数组的地址。函数名和 函数名都是函数地址。函数指针数组可以存放不同参数的函数指针。三、编程题用字符指针打印字符串hello C。定义数组指针指向一维数组并访问元素。用函数指针数组实现简易计算器加减乘除。 参考答案一、选择题BBCAB二、判断题√×是指针数组√√×必须返回值、参数一致三、编程题1. 字符指针打印字符串#include stdio.h int main() { const char* p hello C; printf(%s\n,p); return 0; }2. 数组指针访问数组#include stdio.h int main() { int arr[5] {1,2,3,4,5}; int (*p)[5] arr; int i0; for(i0;i5;i) { printf(%d ,(*p)[i]); } return 0; }3. 函数指针数组计算器见正文转移表代码 本讲总结字符指针指向常量字符串时存首字符地址只读字符串共享内存。数组指针int (*p)[10]指向数组存放数组名。二维数组传参本质传数组指针形参可写二维数组 / 数组指针。函数指针存放函数地址int (*pf)(int,int)可直接调用函数。typedef简化复杂指针类型命名。函数指针数组存放同类型函数指针用于转移表。转移表替代switch-case让多分支函数调用更简洁、易扩展。 版权说明本文为 C 语言系统学习原创笔记基于标准课件体系整理纯干货零基础友好未经允许禁止转载如有错误欢迎评论区指正

相关文章:

【C 语言系统入门教程】第 14 讲:深入理解指针 (4) | 零基础学习笔记

【C 语言系统入门教程】第 14 讲:深入理解指针 (4) | 零基础学习笔记 前言 本讲是指针进阶收官篇,聚焦字符指针、数组指针、二维数组传参、函数指针、函数指针数组、转移表六大高阶指针知识点,彻底打通 C 语言指针的最后壁垒,是…...

第17届蓝桥杯C语言B组省赛题目

2026年4月11日#include <stdio.h>int main() {long long N 2026202520242023;long long ans 0;for (long long i 0; i < 1013101260121012; i){if (N-i > i){ans;}else{return 0;}}printf("%lld", ans);return 0; }#include <stdio.h>long long…...

测试报告革命:用数据讲故事的艺术

在软件测试领域&#xff0c;一份标准的测试报告往往呈现为冰冷数据的堆砌&#xff1a;缺陷总数、严重等级分布、测试用例通过率、自动化覆盖率……这些数字精确地度量了测试活动&#xff0c;却常常在向产品经理、技术总监或业务方汇报时&#xff0c;遭遇尴尬的沉默。当汇报者逐…...

折腾Cursor这几周,我才发现之前编辑器都用错了

折腾Cursor这几周&#xff0c;我才发现之前编辑器都用错了 上个月还在用Codex的时候&#xff0c;朋友就天天安利Cursor。我心想不就是个套壳VS Code吗&#xff0c;能用出什么花来。 结果上周闲得无聊&#xff0c;装了一个试了试。 真香。 不是那种“哇好厉害”的感叹&#…...

Java全栈工程师面试实录:从技术到业务的深度解析

Java全栈工程师面试实录&#xff1a;从技术到业务的深度解析 1. 开场白 面试官&#xff1a;你好&#xff0c;很高兴见到你。我是负责技术评估的面试官&#xff0c;今天我们会围绕你的技术能力、项目经验以及对业务的理解来展开交流。你可以先简单介绍一下自己。 应聘者&#xf…...

2025最权威的AI论文助手横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI开题报告工具借助自然语言处理以及知识图谱技术&#xff0c;能够迅速剖析研究领域的热点之…...

长推理不一定更强:北航 × 字节提出SAGE-RL,挖出大模型隐藏天赋

大模型其实“心里有数”&#xff0c;天生具备高效推理的潜能。论文标题&#xff1a;Does Your Reasoning Model Implicitly Know When to Stop Thinking?研究团队&#xff1a;北航字节跳动联合研究论文地址&#xff1a;https://arxiv.org/abs/2602.08354项目主页&#xff1a;h…...

Houdini流体进阶:巧用VDB与Collision Source实现复杂容器碰撞(含静态对象设置)

Houdini流体进阶&#xff1a;巧用VDB与Collision Source实现复杂容器碰撞&#xff08;含静态对象设置&#xff09; 在影视级流体特效制作中&#xff0c;最令人头疼的莫过于液体与复杂几何体的交互问题。当你的咖啡需要流过一个镂空的金属滤网&#xff0c;或是红酒要注入造型奇特…...

避开这些坑,你的华为机考也能多拿100分:通软开发三道真题拆解与刷题策略

华为通用软件开发机考高分攻略&#xff1a;三道经典题型深度解析与实战技巧 第一次参加华为机考的程序员小王盯着屏幕上的三道题目&#xff0c;手指悬在键盘上方却迟迟敲不下去。距离考试结束还有40分钟&#xff0c;他的第一题代码已经反复修改了五次仍无法通过测试用例。这种场…...

告别自签名警告!用mkcert 1.4.1为本地开发环境一键搞定HTTPS证书(Windows/Linux保姆级教程)

告别自签名警告&#xff01;用mkcert 1.4.1为本地开发环境一键搞定HTTPS证书&#xff08;Windows/Linux保姆级教程&#xff09; 在本地开发Web应用时&#xff0c;HTTPS环境已经成为现代开发的标配需求。无论是测试PWA应用的Service Worker&#xff0c;调试OAuth 2.0授权流程&a…...

Python实战:打造高效GUI工具,实现BLF与ASC格式CAN数据的批量互转

1. 为什么汽车工程师需要BLF与ASC格式转换工具 在汽车电子开发和测试过程中&#xff0c;CAN总线数据记录是最基础也最重要的工作之一。工程师们每天都要处理大量的CAN日志文件&#xff0c;这些文件可能来自不同的测试设备、不同的软件工具&#xff0c;格式也各不相同。其中BLF&…...

超越Grad-CAM:用大核卷积论文技巧可视化你的CNN感受野(含Colab链接)

超越Grad-CAM&#xff1a;大核卷积时代的感受野可视化实战指南 当31x31大卷积核重新成为计算机视觉领域的热门话题时&#xff0c;我们突然发现传统可视化工具已经难以准确捕捉这种"巨无霸"卷积的真实感知能力。去年发表在CVPR上的突破性论文《Scaling Up Your Kernel…...

直播推流避坑指南:为什么你的抖音直播总卡顿?可能是选错了流类型

直播推流避坑指南&#xff1a;为什么你的抖音直播总卡顿&#xff1f;可能是选错了流类型 最近帮几个主播朋友排查直播卡顿问题&#xff0c;发现80%的案例都栽在同一个坑里——推流类型选择错误。明明用的是旗舰级设备&#xff0c;千兆宽带&#xff0c;OBS参数也调得飞起&#x…...

图卷积神经网络3-空域卷积:从GNN到PGC,核心思想与演进脉络解析

1. 空域图卷积的诞生背景 传统图像卷积操作在规则网格数据上表现出色&#xff0c;但当面对社交网络、分子结构这类不规则图数据时就会遇到根本性障碍。想象一下城市交通规划&#xff1a;图像处理就像在整齐的棋盘格上部署红绿灯&#xff0c;而图数据处理则要处理北京胡同里错综…...

RabbitMQ 延迟消息实现:两种方案全解析(TTL+死信 / 延迟插件)实战教程

RabbitMQ 延迟消息实现&#xff1a;两种方案全解析&#xff08;TTL死信 / 延迟插件&#xff09;实战教程前言一、延迟消息基础认知&#xff1a;延迟消息是什么&#xff1f;1.1 定义1.2 典型业务场景1.3 延迟消息流程图&#xff08;通用&#xff09;二、RabbitMQ 实现延迟消息的…...

它不是那种“堆配置”的开发板, 更像是冲着“能直接拿来干活”去的

做嵌入式这些年&#xff0c;大家都有一个感受&#xff0c;现在最贵的&#xff0c;不是芯片&#xff0c;是时间。以前选开发板&#xff0c;很简单&#xff1a;能跑 Linux、接口够用、资料能找到就行&#xff0c;自己要亲自把所有软件硬件都跑一遍&#xff0c;代码甚至都要逐行过…...

RabbitMQ 死信队列(DLX)全面解析:是什么、工作流程、应用场景与实战配置

RabbitMQ 死信队列&#xff08;DLX&#xff09;全面解析&#xff1a;是什么、工作流程、应用场景与实战配置前言一、死信队列基础认知&#xff1a;什么是死信队列&#xff08;DLX&#xff09;&#xff1f;1.1 官方定义1.2 什么是“死信”&#xff1f;1.3 死信队列完整工作流程图…...

AI逆向|使用AI分析aws-waf-token值的加密并纯算

关注它&#xff0c;不迷路。本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01;一.目标地址https://www.imdb.com/二.抓包分析打开控制台后&#xff0c;抓包分析…...

RabbitMQ 消息 TTL 配置:消息过期时间设置全攻略(两种方案+流程图+实战代码)

RabbitMQ 消息 TTL 配置&#xff1a;消息过期时间设置全攻略&#xff08;两种方案流程图实战代码&#xff09;前言一、TTL 基础认知&#xff1a;什么是消息 TTL&#xff1f;1.1 TTL 定义1.2 核心作用1.3 TTL 消息流转流程图二、RabbitMQ 配置 TTL 的两种方式三、方式一&#xf…...

Windows Server 2012上IIS配置全攻略:从开启功能到发布第一个网页(附防火墙设置)

Windows Server 2012 IIS配置实战&#xff1a;从零部署企业级Web服务 在企业内部搭建测试环境或部署小型应用时&#xff0c;Windows Server 2012依然是一个稳定可靠的选择。作为微软服务器操作系统家族的重要成员&#xff0c;其内置的IIS&#xff08;Internet Information Serv…...

别再傻傻分不清了!从光线投射到路径追踪,一张图看懂光线追踪的进化史

从光线投射到路径追踪&#xff1a;计算机图形学的光影革命 当你在玩最新3A游戏时&#xff0c;是否曾被逼真的水面反射和细腻的阴影效果震撼&#xff1f;这背后是光线追踪技术数十年的演进成果。本文将带你穿越时空&#xff0c;从1960年代的光线投射开始&#xff0c;一步步解析光…...

保姆级避坑指南:在ROS Kinetic上从源码编译TurtleBot3仿真包(含Gazebo环境变量报错解决)

从零构建TurtleBot3仿真环境&#xff1a;ROS Kinetic深度避坑实战 第一次在ROS Kinetic上手动编译TurtleBot3仿真包时&#xff0c;我盯着屏幕上CMake报出的turtlebot3_msgs not found错误发了半小时呆。官方Wiki看似步骤清晰&#xff0c;但实际操作中那些未提及的依赖关系和环境…...

深入解析ES正排索引:从doc_values与fielddata的演进看性能与稳定性抉择

1. 正排索引&#xff1a;被忽视的ES性能基石 第一次接触Elasticsearch的开发者往往会被其强大的搜索能力吸引&#xff0c;却忽略了背后支撑聚合、排序等关键功能的正排索引机制。记得2015年我在电商平台处理千万级商品数据时&#xff0c;就曾因为错误配置fielddata导致集群频繁…...

Kali Linux 2024.1 上 Zsh + Oh My Zsh 保姆级配置指南(含国内网络加速方案)

Kali Linux 2024.1 极速配置 Zsh Oh My Zsh 全攻略 作为安全研究人员和开发者的标配系统&#xff0c;Kali Linux 在2024.1版本中已经全面拥抱Zsh作为默认Shell。但国内用户在配置过程中最头疼的莫过于Oh My Zsh的安装问题——那些看似简单的curl命令总是因为网络问题而失败。本…...

CSS如何实现优雅的间距_使用CSS Grid控制盒模型间隙

grid-gap 被弃用是因为 CSS Grid Level 2 规范将其标记为过时&#xff0c;统一改用 gap&#xff1b;它现支持 Grid、Flexbox 和多列布局&#xff0c;但 IE 完全不支持&#xff0c;且 gap 不继承、不与 margin 叠加抵消&#xff0c;subgrid 也不继承父级 gap。grid-gap 为什么被…...

技术深度解析:JPEXS Free Flash Decompiler的逆向工程架构与实现原理

技术深度解析&#xff1a;JPEXS Free Flash Decompiler的逆向工程架构与实现原理 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 在Flash技术被主流浏览器弃用后&#xff0c;大量遗留的…...

如何在 WordPress 中通过邮箱获取用户 ID(PHP 实现)

...

低质代码泛滥:根源与整治

一场席卷软件工程的质量风暴 在当今数字化浪潮下&#xff0c;代码正以前所未有的速度被生产出来。随着AI编程工具的普及&#xff0c;某些案例显示单月代码生成量激增十倍&#xff0c;从数万行跃升至数十万行。全球代码库的年增速超过百分之三十&#xff0c;与此同时&#xff0…...

ANSYS新手必看:如何用虚功原理简化有限元分析(附推导步骤)

ANSYS实战指南&#xff1a;虚功原理在有限元分析中的高效应用 刚接触有限元分析时&#xff0c;我总被那些复杂的数学推导吓退&#xff0c;直到发现虚功原理这个"翻译官"——它能将工程师的物理直觉转化为软件能理解的数学语言。在ANSYS中应用虚功原理&#xff0c;就像…...

Harness Engineering 入门指南:从提示词到AI系统设计的完整跃迁

很多人觉得AI应用做不好&#xff0c;要么是模型不够强&#xff0c;要么是提示词写得不够好。但2026年开发者圈子正在达成一个新共识&#xff1a;AI落地的核心瓶颈根本不在模型&#xff0c;而在那套控制它不乱跑的「缰绳系统」。 这套系统的设计方法&#xff0c;就是现在火遍全网…...