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,跳一个变量的长度,不是跳一个字节。

相关推荐
xx~t1 小时前
嵌入式——51单片机3
linux·c语言·嵌入式硬件·51单片机
山下梅子酒2252 小时前
洛谷-入门-B2042
c语言
ysu_03142 小时前
08-二叉树遍历:四种方式详解
c语言·数据结构·算法·leetcode
ocean21032 小时前
2025-2026年C语言专题面试高频知识点洞察
c语言·面试·面试经验
Lzh编程小栈3 小时前
STM32 DMA深度解析|原理、完整工作流程、寄存器、中断联动,嵌入式面试高频考点(F1系列)
c语言·stm32·单片机·mcu·面试
刃神太酷啦4 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
luj_17684 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法
wuyk5554 小时前
从零吃透 MQTT 通信|第 11 章 MQTT 项目调试验证、性能优化、常见疑难问题、OTA 升级基础
c语言·开发语言·stm32·学习·性能优化
白色的北极熊4 小时前
C 语言 保留 2 位小数并且四舍五入输出
c语言
程序猿阿森6 小时前
C语言预处理完全指南:宏定义、条件编译与头文件规范,一篇搞懂工程化编程
c语言·c++·编译