有哪些令人信服的例子表明指针算术优于数组下标?

2023-11-27

我正在为 C 入门课程准备一些幻灯片,并且尝试展示在数组下标上使用指针算术的良好示例(和动机)。

我在书中看到的很多例子都是相当等效的。例如,许多书籍都展示了如何反转字符串中所有值的大小写,但除了用 *p 替换 a[i] 之外,代码是相同的。

我正在寻找一个好的(简短的)单维数组示例,其中指针算术可以生成更加优雅的代码。有任何想法吗?


再次获取指针而不是值:

当人们想要再次获得指针时,通常会使用指针算术。要在使用数组索引时获取指针:您需要 1) 计算指针偏移量,然后 2) 获取该内存位置的值,然后 3) 必须使用 & 再次获取地址。这是更多的打字和不太干净的语法。

示例1:假设您需要一个指向缓冲区中第 512 个字节的指针

char buffer[1024]
char *p = buffer + 512;

比以下更干净:

char buffer[1024];
char *p = &buffer[512];

示例2:更高效的strcat

char buffer[1024];
strcpy(buffer, "hello ");
strcpy(buffer + 6, "world!");

这比以下更干净:

char buffer[1024];
strcpy(buffer, "hello ");
strcpy(&buffer[6], "world!");

使用指针算术 ++ 作为迭代器:

在迭代元素数组中的每个元素时,使用 ++ 递增指针并使用 -- 递减指针非常有用。它比使用单独的变量来跟踪偏移量更干净。


指针减法:

您可以将指针减法与指针算术结合使用。在某些情况下,这对于获取您所指向的元素之前的元素很有用。也可以使用数组下标来完成,但它看起来非常糟糕且令人困惑。特别是对于Python程序员来说,负下标是从列表末尾开始索引的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有哪些令人信服的例子表明指针算术优于数组下标? 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 将行添加到现有 UITableView 部分

    我正在尝试获取一些示例代码 了解如何将行添加到现有的UITableView 我正在尝试使用insertRowsAtIndexPaths 功能 tableView insertRowsAtIndexPaths addindexes withR
  • 当前 SynchronizationContext 不能用作 TaskScheduler

    我在用Tasks在我的 ViewModel 中运行长时间运行的服务器调用 并将结果编组回Dispatcher using TaskScheduler FromSyncronizationContext 例如 var context Task
  • NSObject +load 和 +initialize - 它们的作用是什么?

    我有兴趣了解导致开发人员覆盖 initialize 或 load 的情况 文档清楚地表明这些方法是由 Objective C 运行时为您调用的 但这实际上是这些方法的文档所清楚的全部内容 我的好奇心来自于查看 Apple 的示例代码 MVC
  • MySQL 触发器是否可以与多个表或所有表关联?

    我创建了这个触发器来将计算值插入到表中的字段中 以防用户忘记自己输入数据 DELIMITER CREATE TRIGGER OnNewTableRegistry BEFORE INSERT ON eduardo8 plataforma ta
  • UITextField起始光标位置错误

    我有一个带有一些预编译文本的文本字段 文本字段内的文本在视觉上是右对齐的 当我点击文本字段时 我希望光标位于文本末尾 以便我可以准备编辑文本 默认情况下 光标位于文本的开头 或者如果我点击某个单词 则光标位于该单词的末尾 我尝试设置sele
  • Python Spyder 无法初始化 GLX

    尝试设置一个桌面站进行图像处理 我最近安装了 ubuntu 16 04 并经历了guide由 Adrian 安装 python3 cv2 和虚拟环境 我没有使用 cv2 3 1 0 而是使用了 cv2 3 2 0 但除此之外 一切都是一样的
  • 错误:无法加载文件或程序集 netstandard,版本=2.1.0.0

    我有一个 AzureFunctions 项目 需要升级到 NET 标准 2 1 从 2 0 解决方案中的所有其他项目均正确加载和编译 但此 AzureFunctions 项目抛出此错误 错误 System IO FileNotFoundEx
  • 使用 LINQ 对字符串数组进行排序

    我有一个字符串数组声明如下 string data new string 3 string name new string 10 string contact new string 10 string address new string
  • 将 SharedPreferences 文件保存到自定义目录或获取默认 SharedPreferences 目录

    是否可以将 SharedPreferences 文件保存到自定义目录中 让我们说成 data data package name my prefs 或者是否可以检索 SharedPreferences 默认保存到的目录 附 硬编码路径 da
  • 整数数组转二进制数组

    我有一个整数数组 a 3 4 5 6 7 我想将其转换为每个四位的二进制数组 对于上面的整数数组 我想得到以下二进制数组 abinary 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 有什么快速的方法可以做
  • 使用 Powershell 和 Test-Path,如何区分“文件夹不存在”和“访问被拒绝”

    在powershell中使用Test Path命令 如何区分 文件夹不存在 和 访问被拒绝 TL DR 好消息是Test Path即使您缺乏权限 通常也不会返回 false 当没有权限时 您会得到一个异常 而不是一个简单的 false 更深
  • 从 UITextView 的单词中长按获取单词

    现在我已经在 UITextView 中检测到长按 void viewDidLoad super viewDidLoad UILongPressGestureRecognizer LongPressgesture UILongPressGes
  • 更改自定义工具栏文本

    无法更改工具栏上的文本 我已经进行了搜索 但没有看到任何结果 我尝试了很多组合 但也许会出现一些东西 这是我在活动中尝试的最后一件事的代码 Toolbar toolbar Toolbar findViewById R id toolbarC
  • 用于rails和ios身份验证的omniauth

    我有一个 Rails 应用程序 可以处理 iOS 客户端的 api 我使用 devise omniauth facebook 作为 Rails 对于 iOS 客户端 我使用帐户和社交框架进行 Facebook 身份验证 我已经获取了 oau
  • ClusterIP 服务是否在副本 Pod 之间分发请求?

    你们知道如果ClusterIP服务在目标部署副本之间分配工作负载 我有 5 个后端副本 ClusterIP 服务选择它们 我还有另外 5 个 nginx pod 副本指向此后端部署 但是 当我运行一个繁重的请求时 后端会停止响应其他请求 直
  • OpenCV,拉普拉斯算子的变体(Java)

    我试图根据图像定位拉普拉斯算子的变体 目的是根据图像的模糊度获得数值 这是一个有用的帖子http www pyimagesearch com 2015 09 07 blur detection with opencv cv2 Laplaci
  • 如何使用AES加密java中的文件[重复]

    这个问题在这里已经有答案了 我需要知道如何创建 AES 并使用它来加密和解密 java 中的文件 尝试使用CipherOutputStream并传递一个FileOutputStream See http www java2s com Tut
  • tbloader 与 SPARQL INSERT - 为什么命名图有不同的行为?

    ARQ TDB 和命名图的命令行工具的连接存在奇怪的行为 如果通过 tdbloader 在命名图中导入数据 则无法通过 SPARQL SELECT 查询中的 GRAPH 子句进行查询 但是 当使用 SPARQL INSERT 在同一图中插入
  • C语言中如何提取浮点数的小数部分?

    如何提取浮点数的小数部分并将小数部分和整数部分存储到两个单独的整数变量中 您使用modf功能 double integral double fractional modf some double integral 您也可以将其转换为整数 但
  • 有哪些令人信服的例子表明指针算术优于数组下标?

    我正在为 C 入门课程准备一些幻灯片 并且尝试展示在数组下标上使用指针算术的良好示例 和动机 我在书中看到的很多例子都是相当等效的 例如 许多书籍都展示了如何反转字符串中所有值的大小写 但除了用 p 替换 a i 之外 代码是相同的 我正在