C语言中指针+1得到什么值

在涉及指针强制类型转换的时候,对指针的下一个地址的跳转有点模糊了,看下面例子

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 ≠ 地址 + 1 字节 ,而是 地址 + 指针类型的大小
  2. 步长规则:char*+1=+1,int*+1=+4,long*+1=+8
  3. 本质目的:让指针可以像数组一样,轻松访问下一个完整数据

一句话记忆

指针加 1,跳一个变量的长度,不是跳一个字节。

相关推荐
zz345729811334 分钟前
C语言中字符串常量存储位置
c语言·开发语言·算法·青少年编程
noipp35 分钟前
推荐题目:洛谷 P16510 [GKS 2015 #C] gRanks
java·c语言·开发语言·c++·python·算法
程序喵大人36 分钟前
从内存/汇编角度看C与C++:指针、引用、对象的底层差异
c语言·汇编·c++·指针·引用·对象
Swift社区1 小时前
OpenHarmony鸿蒙PC平台移植 gifsicle:CC++ 三方库适配实践(Lycium tpc_c_cplusplus)
c语言·c++·harmonyos
東隅已逝,桑榆非晚2 小时前
编译和链接
c语言·笔记
FFZero12 小时前
[mpv插件系统] (一) Lua 闭包与上值 — 从概念到 C API
c语言·junit·lua
秋越2 小时前
从工程角度理解嵌入式C语言关键字
c语言·开发语言·嵌入式·嵌入式软件开发·嵌入式c语言·c语言关键字
代码地平线3 小时前
C++ 入门篇类和对象·上篇:从本质深剖类与对象与C++基本用法
c语言·开发语言·数据结构·c++·笔记·算法
syker3 小时前
AIFerric 多硬件后端完整支持方案
c语言
社交怪人4 小时前
【三个数】信息学奥赛一本通C语言解法(题号2053)
c语言