【C语言】(9)—指针3

文章目录

  • 一、字符指针的深入理解
  • 二、数组指针详解
  • 三、二维数组传参的本质
  • 四、函数指针及其应用
  • 五、函数指针数组与转移表

一、字符指针的深入理解

1.1 字符指针的基本使用
字符指针(char*)是指向字符类型数据的指针,它有两种常见的使用方式:

// 方式一:指向单个字符
char ch = 'w';
char *pc = &ch;
*pc = 'a';  // 修改ch的值为'a'// 方式二:指向字符串常量
const char* pstr = "hello bit";
printf("%s\n", pstr);  // 输出: hello bit

1.2 字符串常量的存储特性
需要特别注意第二种使用方式中字符串常量的存储特性:

const char *str3 = "hello bit";
const char *str4 = "hello bit";if(str3 == str4) {printf("str3和str4指向同一地址\n");
} else {printf("str3和str4指向不同地址\n");
}

二、数组指针详解

2.1 数组指针的定义
数组指针是指向整个数组的指针,而不是指向数组元素的指针。它的定义方式如下:

int arr[10] = {0};
int (*p)[10] = &arr;  // p是指向包含10个int元素的数组的指针

理解数组指针的关键在于运算符优先级:

[]的优先级高于*

因此int *p[10]表示指针数组(包含10个int指针的数组)

而int (*p)[10]表示数组指针(指向包含10个int元素的数组的指针)

2.2 数组指针的使用示例

#include <stdio.h>int main() {int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};int (*p)[4] = arr;  // 指向第一行(一个包含4个int的数组)for(int i=0; i<3; i++) {for(int j=0; j<4; j++) {printf("%2d ", *(*(p+i)+j));  // 等价于p[i][j]}printf("\n");}return 0;
}

三、二维数组传参的本质

3.1 二维数组的内存布局
二维数组实际上是"数组的数组",在内存中按行优先顺序连续存储。例如:

int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}
};

3.2 二维数组传参的两种形式
形式一:使用二维数组语法

void printArray(int arr[][4], int rows) {for(int i=0; i<rows; i++) {for(int j=0; j<4; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}

形式二:使用数组指针语法

void printArray(int (*arr)[4], int rows) {for(int i=0; i<rows; i++) {for(int j=0; j<4; j++) {printf("%d ", *(*(arr+i)+j));}printf("\n");}
}

四、函数指针及其应用

4.1 函数指针的基本概念
函数指针是指向函数的指针变量,它存储的是函数的入口地址:

#include <stdio.h>int add(int a, int b) {return a + b;
}int main() {int (*pf)(int, int) = add;  // 等价于 &addprintf("%d\n", pf(2, 3));    // 输出: 5printf("%d\n", (*pf)(3, 5)); // 输出: 8return 0;
}

4.2 函数指针的类型解析
函数指针类型的组成:

返回类型:int

指针名称:pf

参数类型:(int, int)

因此int (*pf)(int, int)表示:

pf是一个指针

指向一个返回int并接受两个int参数的函数

五、函数指针数组与转移表

5.1 函数指针数组的定义
函数指针数组是存储多个函数指针的数组,可用于实现"转移表":

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 div(int a, int b) { return a / b; }int (*funcArray[4])(int, int) = {add, sub, mul, div};

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

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

相关文章

MDK调试技巧

1、自动生成反汇编 fromelf -c -o "$LL.txt" "#L" 解释&#xff1a; 1、fromelf 是 ARM Compiler 工具链中的一个命令行工具&#xff0c;从fromelf这个名字上我们就能看到它是用来处理elf文件的&#xff0c;elf 全称 Executable and Linking Format &…

嵌入式STM32学习——433M无线遥控灯

1.433M无限模块工作原理&#xff1a; 数据发射模块的工作频率为315M&#xff0c;采用声表谐振器SAW稳频&#xff0c;频率稳定度极高&#xff0c;当环境温度在-25~85度之间变化时&#xff0c;频飘仅为3ppm。 接收到信号&#xff0c;接收模块对应针脚输出高电平&#xff0c;有DO…

JDBC工具类的三个版本

一、JDBC连接数据库的7个步骤 1、加载驱动 2、获取连接 3、编写sql 4、获取执行sql的stmt对象 有两种 stmt&#xff08;存在sql注入问题 字符串拼接&#xff09; pstmt&#xff08;预编译可以防止sql注入&#xff09; 5、执行sql 拿到结果集 6、遍历结果集 7、关闭资源…

3.1/Q1,Charls最新文章解读

文章题目&#xff1a;Predictive model for sarcopenia in chronic kidney disease: a nomogram and machine learning approach using CHARLS data DOI&#xff1a;10.3389/fmed.2025.1546988 中文标题&#xff1a;慢性肾病肌肉减少症的预测模型&#xff1a;使用 CHARLS 数据的…

DEEPPOLAR:通过深度学习发明非线性大核极坐标码(2)

目录 2.问题的提出和背景 2.1 信道编码 2.2.极化码 极坐标编码 极坐标解码 原文&#xff1a;《DEEPPOLAR: Inventing Nonlinear Large-Kernel Polar Codes via Deep Learning》 2.问题的提出和背景 2.1 信道编码 信道编码是一种为传输添加冗余的技术&#xff0c;使其对…

手机当电脑播放器 soundwire

soundwire server免费下载_soundwire serverPC下载_3DM软件 win11可用延迟1秒 安卓端音频缓冲区大小改成8k延迟就没那么夸张了 我用audiorelay连上了没声音

LVGL中的事件

文章目录 &#x1f9f1; 一、什么是 LVGL 事件&#xff1f;&#x1f3af; 二、事件回调的注册参数解释&#xff1a;示例&#xff1a; &#x1f4da; 三、常见事件类型&#xff08;lv_event_code_t&#xff09;✅ 1. 输入类事件&#xff08;用户交互&#xff09;✅ 2. 组件状态类…

警惕C#版本差异多线程中的foreach陷阱

警惕C#版本差异多线程中的foreach陷阱​ 同样的代码,不同的结果闭包捕获的“时间差”问题绕过闭包陷阱的三种方法Lambda立即捕获(代码简洁)显式传递参数(兼容性最佳)使用Parallel.ForEach(官方推荐)注意事项:版本兼容性指南警惕多线程中的foreach陷阱:C#版本差异引发的…

mac u盘重装mac10.15Catalina系统

我的电脑提mac2017的air 重装过程 (文件夹中间有空格时为 Install\ macOS\ Catalina 才行) &#xff08;有需要的&#xff0c;最好做一下备份&#xff0c;有些东西可以及时找到配置和文件之类的&#xff0c; u盘制作是在mac电脑上操作的) 一、先下载系统镜像文件或自行到官方…

说说es配置项的动态静态之分和集群配置更新API

这天因为某件工作来到了es官网某个参数配置相关的页面&#xff0c;注意到了下图圆圈里的“Dynamic”&#xff1a; 链接&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cluster.html#misc-cluster-settings 显然这是对配置项的一个描述&am…

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了&#xff0c;还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分&#xff0c;可以参考此指南进行最后的复习要领&a…

web animation API 锋利的css动画控制器 (更新中)

什么是web animation api 以及为什么要使用web animation api&#xff1f; web animation API 是web页面中控制DOM元素动画效果的javascript原生API。 它能够逐个关键帧控制动画效果&#xff0c;具有Timeline 机制‌能通过javascript来实现动画的暂停&#xff0c;播放&#x…

Linux基础io知识

理解 "文件" 狭义理解 文件在磁盘里 磁盘是永久性存储介质&#xff0c;因此文件在磁盘上的存储是永久性的 磁盘是外设&#xff08;即是输出设备也是输入设备&#xff09; 磁盘上的文件 本质是对文件的所有操作&#xff0c;都是对外设的输入和输出 简称 IO 广义理解…

视频编解码学习三之显示器续

一、现在主流的显示器是LCD显示器吗&#xff1f; 是的&#xff0c;现在主流的显示器仍然是 LCD&#xff08;液晶显示器&#xff0c;Liquid Crystal Display&#xff09;&#xff0c;但它已经细分为多种技术类型&#xff0c;并和其他显示技术&#xff08;如OLED&#xff09;形成…

[测试]并发模拟工具Apache Bench 进行AB压力测试

下载(windows) https://www.apachelounge.com/download/ 下载后解压&#xff0c;解压后进入bin目录&#xff0c;打开CMD&#xff0c;即可使用 命令 ab.exe -n 请求总数 -c 并发数 http://网站/ 比如ab.exe -n 1000 -c 100 http://127.0.0.1:5555/ 看不懂的话直接把结果让AI分析…

LeetCode 热题 100 138. 随机链表的复制

LeetCode 热题 100 | 138. 随机链表的复制 大家好&#xff0c;今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求深拷贝一个带有随机指针的链表。 问题描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额…

开源分享:TTS-Web-Vue系列:Vue3实现固定顶部与吸顶模式组件

&#x1f3af; 本文是TTS-Web-Vue系列的第十三篇文章&#xff0c;重点介绍项目中固定顶部导航和内容区域吸顶模式的实现方案。通过这些优化&#xff0c;我们大幅提升了用户在滚动页面时的交互体验&#xff0c;使关键操作区域始终可见&#xff0c;同时实现了更现代化的界面视觉效…

Docker、Docker-compose、K8s、Docker swarm之间的区别

1.Docker docker是一个运行于主流linux/windows系统上的应用容器引擎&#xff0c;通过docker中的镜像(image)可以在docker中构建一个独立的容器(container)来运行镜像对应的服务&#xff1b; 例如可以通过mysql镜像构建一个运行mysql的容器&#xff0c;既可以直接进入该容器命…

用浏览器打开pdf,如何使用划词翻译?

1. 浏览器 | 扩展 | 获取 Microsoft Edge 扩展 2. 搜索 “沙拉查词” 点击“获取” 3. 扩展这里选择 管理扩展 勾选 “允许访问文件url” 注&#xff1a;这里一定要勾选&#xff0c;否则沙拉查词无法访问.pdf 文件&#xff01;&#xff01;&#xff01;会出现下图错误 4. 右击…

深入解析STM32中断机制:从原理到外部中断实战

知识点1【中断的介绍】 单片机的中断——硬件中断 Linux操作系统的中断——软件中断 中断是指计算机运行过程中&#xff0c;出现某种意外情况需要主机干预&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后有返回原本暂停的程序继续运…