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

68 指针的减法操作

前言

这是一个 老生常谈的问题

就是 两个结构体Person指针, p1, p2, 指向的是 虚拟内存中相邻的两个结构体对象

然后 p2 – p1 的值得到的是 1, 而不是 sizeof(struct Person)

然后 我们来看一下 这里的编译之后的是一个实现

 

 

测试用例

这里 我们通过调节 field03 来调整 Person 结构体的占用空间 

并参照 两份编译之后的 结果

#include<stdio.h>typedef struct Person {int age;int height;
//    int field03;
} Person;int main(int argc, char **argv) {struct Person list[10], *p1, *p2;list[0].age = 12;list[2].age = 22;p1 = &list[0];p2 = &list[2];int delta = (int) (p2 - p1);printf(" the delta : %d \n", delta);return 0;}

 

 

sizeof(Person) 为 8

我们来看一下 0x00000000004005DF 的位置的相关系列代码 

对应于业务代码中的 “int delta = (int) (p2 - p1);”

获取了 p2指针 和 p1指针, 然后做减法, 然后右移了3位, 等价于 /8, 然后将结果为 delta

 

看一下 运行时的状态

 

 

 

sizeof(Person) 为 12

我们来看一下 0x00000000004005E5 的位置的相关系列代码 

对应于业务代码中的 “int delta = (int) (p2 - p1);”

获取了 p2指针 和 p1指针, 然后做减法, 然后右移了2位, 等价于 /4

然后又乘以了一个 0xaaaaaaaaaaaaaaab, 等价于 / 3

因此最终是将 p2指针 和 p1指针 的地址之差 除以了 12

可以大致得出的规律 是结构体指针的减法是 两者地址只差, 还要除以 sizeof(struct Type)

 

看一下 运行时的状态

 

 

关于 /3 的实现的一个测试用例 

 

 

关于规范

这个在 c/c++ 相关规范中能够找到具体的说明 

Arithmetic operators - cppreference.com

 

 

 

 

 

http://www.lryc.cn/news/586253.html

相关文章:

  • 【Datawhale AI夏令营】Task2 笔记:MCP Server开发的重难点
  • 使用包管理工具CocoaPods、SPM、Carthage的利弊与趋势
  • tiktok 弹幕 逆向分析
  • 系统性能评估方法深度解析:从经典到现代
  • 数据湖和数据库对比
  • 多层感知机的简洁实现
  • Spring Cloud Gateway中常见的过滤器
  • 【时间之外】尘封的智能套件复活记
  • 【QGC】深入解析 QGC 配置管理
  • Gas and Gas Price
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十课——图像gamma矫正的FPGA实现
  • Git企业级开发(最终篇)
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十一课——图像均值滤波的FPGA实现
  • TCP的socket编程
  • OneCode 3.0架构深度剖析:工程化模块管理与自治UI系统的设计与实现
  • 多路选择器的学习
  • 前端面试专栏-算法篇:24. 算法时间与空间复杂度分析
  • TCP与UDP协议详解:网络世界的可靠信使与高速快递
  • 苍穹外卖-day06
  • docker—— harbor私有仓库部署管理
  • Linux进程管理的核心:task_struct中的双链表与网状数据结构
  • Linux驱动08 --- 数据库
  • C++ Map 和 Set 详解:从原理到实战应用
  • 【Spring AOP】什么是AOP?切点、连接点、通知和切面
  • Python 实战:构建 Git 自动化助手
  • RabbitMQ面试精讲 Day 1:RabbitMQ核心概念与架构设计
  • 网络安全初级第一次作业
  • 医疗AI前端开发中的常见问题分析和解决方法
  • Filament引擎(三) ——引擎渲染流程
  • 【GESP】C++ 2025年6月一级考试-客观题真题解析