Z
ZHANK

指针运算

指针 +/- 整数、指针相减、NULL 指针、void* 泛型指针

指针运算

指针不只是存地址——它可以做加减运算,和数组天然契合。

学完本章你将: 掌握指针 +/- 整数、指针相减、void* 泛型指针。


指针 + 整数

c
#include <stdio.h>

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int *p = arr;  // 指向第一个元素

    printf("%d\n", *p);         // 10
    printf("%d\n", *(p + 1));   // 20(不是地址加 1,是移一个 int!)
    printf("%d\n", *(p + 2));   // 30

    return 0;
}

💡 p + 1 不是把地址加 1 个字节,而是加 1 * sizeof(int) 个字节。编译器自动按类型大小缩放——这叫指针算数


指针与类型大小

c
int    *pi = (int*)    0x1000;
char   *pc = (char*)   0x1000;
double *pd = (double*) 0x1000;

// pi + 1 → 0x1004(+4 字节)
// pc + 1 → 0x1001(+1 字节)
// pd + 1 → 0x1008(+8 字节)

指针相减

c
int arr[] = {10, 20, 30, 40, 50};
int *start = &arr[0];  // 指向 10
int *end   = &arr[4];  // 指向 50

ptrdiff_t diff = end - start;  // 4(不是字节数,是元素个数)
printf("相隔 %td 个元素\n", diff);

void* —— 泛型指针

c
int x = 42;
double y = 3.14;

void *p;
p = &x;          // 可以指向任何类型
p = &y;          // 切换目标

// *p = 100;     // ❌ 不能解引用——编译器不知道类型
int *pi = (int *)p;  // 先强制转换
*pi = 100;           // ✅ 现在可以了

💡 void* 是 C 语言的"任意指针"——常用于 malloc(返回 void*)和回调函数。