指针运算
指针 +/- 整数、指针相减、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*)和回调函数。