在涉及指针强制类型转换的时候,对指针的下一个地址的跳转有点模糊了,看下面例子
int *pt;
pt = (int *)&info_evt;
pt++
这里pt++是向后跳过一个整型变量大小,而不是跳过下一个结构体变量,因为pt指针强制转换后,指向的是整型类型,而不是结构体类型了。
C 语言指针 + 1 的核心原理
指针 + 1 不是简单的地址数值 + 1,而是向后跳过「一个完整的指针指向类型」的大小,这是 C 语言指针最核心的特性之一。
指针 + 1 ≠ 地址 + 1 字节 ,而是 地址 + 指针类型的大小。
一、核心公式
新地址 = 原地址 + sizeof(指针指向的数据类型) * 1
简单说:指针加 1,步长由指针的类型决定,不是固定加 1 字节。
二、直观例子(一看就懂)
假设内存起始地址是 1000,定义不同类型的指针:
char *p1 = (char*)1000; // 指向char(1字节)
int *p2 = (int*)1000; // 指向int(4字节,32/64位通用)
long *p3 = (long*)1000; // 指向long(8字节)
执行 +1 后结果:
| 指针类型 | 原地址 | 类型大小 | 指针 + 1 后地址 |
|---|---|---|---|
| char* | 1000 | 1 字节 | 1001 |
| int* | 1000 | 4 字节 | 1004 |
| long* | 1000 | 8 字节 | 1008 |
三、完整可运行代码验证
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30};
int *p = arr; // 指针指向数组首元素
printf("原指针地址:%p\n", p);
printf("指针+1后地址:%p\n", p + 1);
// 打印地址差值,验证步长是4字节(int大小)
printf("地址差值:%d 字节\n", (int)(p+1 - p));
return 0;
}
输出结果(关键)
原指针地址:0061FF10
指针+1后地址:0061FF14
地址差值:4 字节
✅ 清晰证明:int* +1 直接跳过 4 字节,指向下一个 int 元素。
四、为什么要这么设计?
这个机制是为了方便操作数组,让指针和数组用法统一:
int arr[] = {10,20,30};
int *p = arr;
// 指针+1 等价于 取下一个数组元素
printf("%d", *(p+1)); // 输出 20,和 arr[1] 完全一样
五、总结(必背)
- 指针 + 1 ≠ 地址 + 1 字节 ,而是 地址 + 指针类型的大小
- 步长规则:
char*+1=+1,int*+1=+4,long*+1=+8 - 本质目的:让指针可以像数组一样,轻松访问下一个完整数据
一句话记忆
指针加 1,跳一个变量的长度,不是跳一个字节。