# 5.4 地址算术运算

指针算术运算，或者地址算术运算。

c 语言支持 3 种格式的指针算术运算：

* 指针加上整数
* 指针减去整数
* 两个指针相减

前两种就是指针的移动：

```
p=&a[2];
q=p+3;
```

两个指针相减：

```
#include <stdio.h>
#include <stddef.h>


int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr1 = arr; //指向首元素 1
    int *ptr2 = &arr[3]; //指向第4个元素 4

    // 计算指针之间的偏移量
    ptrdiff_t diff = ptr2 - ptr1;

    printf("指针之间的偏移量为：%td\n", diff);

    return 0;
}
/* 
  ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ ptrdiff_t 是C语言标准库 <stddef.h> 中定义的一个整数类型，用于存储指针之间的偏移量。                                                           │
  │ 在上面的示例中，我们使用 %td 格式说明符来打印 ptrdiff_t 类型的值。 
  | OUTPUT:      
  | 指针之间的偏移量为：3                                                                │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
 */
```

计算指针之间的偏移量在许多情况下都是很有用的，特别是在处理数组和动态内存分配时。以下是一些常见情况：

1. 数组操作：

* * 当你在处理数组时，有时需要知道两个元素之间的距离，以便执行一些特定的操作，比如搜索、排序或者拷贝。

2. 内存管理：

* * 在动态内存分配中，比如使用 `malloc` 分配内存，**你可能会需要知道内存块的大小或者两个内存块之间的距离**，以便进行正确的内存管理和释放。

3. 数据结构：

* * 在数据结构中，指针的相对位置可能提供了有关数据结构的关键信息。比如在链表中，计算节点之间的距离可能会帮助你在链表中移动。

4. 指针运算：

* * C语言允许进行指针的算术运算，比如指针的加法和减法。计算指针之间的偏移量是进行这些运算的一部分。

总的来说，**计算指针之间的偏移量提供了有关内存布局和数据结构的重要信息，它使得程序能够更有效地操作数据和进行内存管理**。在很多情况下，了解指针之间的偏移量是编写高效、可靠的C语言程序的关键。
