C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言 指针差值计算

C语言实现指针差值计算的示例

作者:学逆向的

本文主要介绍了C语言实现指针差值计算的示例,必须是同类型、指向同一数组,结果是元素个数而非字节数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

指针相减规则

前提:两个指针必须是同类型、指向同一块连续内存(同一数组),否则未定义行为
公式:

指针差值 = (地址p1 - 地址p2) / sizeof(指针对应的类型)

含义:得到两个指针之间相隔多少个元素,不是相差多少字节
示例 1:int*

int *p1 = (int*)20;
int *p2 = (int*)4;
// 地址差:20 - 4 = 16字节
// sizeof(int)=4
p1 - p2 = 16 / 4 = 4  // 相隔4个int元素

示例 2:short*

short *p1 = (short*)20;
short *p2 = (short*)4;
// 地址差:16字节
// sizeof(short)=2
p1 - p2 = 16 / 2 = 8 // 相隔8个short元素

两类指针运算区分

  1. 指针 ± 整数:p + n 底层地址 = 原地址 + n * sizeof(type)
  2. 含义:向后 / 向前移动 n 个元素
int *p = 0x100;
p+2 → 地址 = 0x100 + 2*4 = 0x108
  1. 指针 - 指针:只允许同类型指针,结果是元素个数(ptrdiff_t类型) ✅ 只能减,不能相加!p1+p2 语法直接报错

指针比较运算

● > < >= <= == !=:直接比较内存地址的大小
● 限制:只推荐同一连续内存(数组)内比较;跨区域指针比较属于未定义行为
● 用途:数组循环边界判断
易混淆点

  1. 不要把元素个数和字节数搞混:指针运算自动带上类型宽度
  2. 指针相减返回类型是ptrdiff_t(有符号整型),不是 int
  3. 不同类型指针不能直接相减、直接比较
  4. 野指针、不在同一数组的指针做减法 / 比较 → 未定义行为
#include <stdio.h>
int main(void)
{
    int arr[] = {10,20,30,40,50};
    int *p1 = &arr[4];
    int *p2 = &arr[0];
    printf("p1-p2 = %td\n", p1-p2); // 输出4,中间相隔4个int元素
    return 0;
}

底层汇编简要
指针加减元素:编译器会把偏移量 × 类型大小(shl 移位指令,4 字节 int 等价左移 2 位),再和基地址相加

到此这篇关于C语言实现指针差值计算的示例的文章就介绍到这了,更多相关C语言 指针差值计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文