当前位置: 首页 > 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.dtcms.com/a/276718.html

相关文章:

  • C语言文件读操作详解:使用fgets函数实现安全的按行读取
  • 在YOLO-World中集成DeformConv、CBAM和Cross-Modal Attention模块的技术报告
  • 进制转换算法详解及应用
  • 红旗新能源车:驾驭梦想,驶向未来
  • TDengine 使用最佳实践(1)
  • 系统性能评估方法深度解析:从经典到现代
  • 【C/C++】编译期计算能力概述
  • 《汇编语言:基于X86处理器》第7章 整数运算(3)
  • Noting
  • L1正则化 VS L2正则化
  • 全连接网络 和卷积神经网络
  • 《Java Web程序设计》实验报告一 Java Web环境配置
  • Cypress与多语言后端集成指南
  • C++——类和对象的相关知识点
  • 复习笔记 31
  • RHCSA(2)
  • STM32--USART串口通信的应用(第一节串口通信的概念)
  • docker网络与数据持久化
  • SolidWorks并发不足频出,浮动许可还能怎么优化?
  • Python 中 enumerate(s) 和 range() 的对比
  • 博途多重背景、参数实例--(二)
  • 分布式系统高可用性设计 - 缓存策略与数据同步机制
  • 飞算JavaAI:重新定义Java开发效率的智能引擎
  • Cell2location maps fine-grained cell types in spatial transcriptomics 文章解析
  • 基于Python Keras 实践大全
  • STP生成树协议
  • 堆内存的详细结构以及java中内存溢出和排查方式
  • Jinja2模板引擎技术在dify中的应用方法
  • Python基于Django的WEB服务统一身份认证协议的设计与实现【附源码、文档说明】
  • 3 c++提高——STL常用容器(一)