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( P erson) 为 8

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

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

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

看一下 运行时的状态

sizeof( P erson) 为 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

相关推荐
王德博客32 分钟前
【从基础到实战】STL string 学习笔记(上)
c++·笔记·学习
Algebraaaaa1 小时前
C++ 中 NULL 与 nullptr 有什么区别?
开发语言·c++
源代码•宸4 小时前
深入浅出设计模式——创建型模式之建造者模式 Builder
c++·经验分享·设计模式·建造者模式
itgather5 小时前
智能图书馆管理系统开发实战系列(五):前后端集成 - koffi调用与接口设计
c++·koffi
爱吃KFC的大肥羊5 小时前
C/C++常用字符串函数
c语言·数据结构·c++·算法
岁忧7 小时前
(nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
java·c++·算法·leetcode·go·散列表
我要成为c嘎嘎大王7 小时前
【C++】类和对象(2)
开发语言·c++
C++ 老炮儿的技术栈8 小时前
在vscode 如何运行a.nut 程序(Squirrel语言)
c语言·开发语言·c++·ide·vscode·算法·编辑器
HKUST_ZJH8 小时前
交互 Codeforces Round 1040 Interactive RBS
c++·算法·交互
weixin_3077791310 小时前
设计Mock华为昇腾GPU的MindSpore和CANN的库的流程与实现
c++·算法·华为·系统架构·gpu算力