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

相关推荐
kkkkkkkkkk_Z9 小时前
学嵌入式和C语言编程数据结构|学习日记Day22:栈,二叉树,哈希存储
c语言·数据结构·学习
Navigator_Z9 小时前
LeetCode //C - 1206. Design Skiplist
c语言·算法·leetcode
码行山野赴时序归途9 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
Navigator_Z12 小时前
LeetCode //C - 1209. Remove All Adjacent Duplicates in String II
c语言·算法·leetcode
码行山野赴时序归途14 小时前
算法效率的度量(上):时间复杂度中的对数思维
c语言·数据结构·算法
单片机仿真设计16 小时前
【proteus仿真】基于 STM32 的智能垃圾桶设计(仿真图+程序)
c语言·stm32·stm32单片机·proteus·毕设·仿真
是隼人20 小时前
buuctf-pwn axb_2019_fmt32题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
老一岁21 小时前
c问题总结(2)
c语言·开发语言
奶茶树21 小时前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github
xys_67821 小时前
深挖C语言:动态内存管理
c语言·开发语言