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

相关推荐
LDR0065 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
Luminous.5 天前
C语言--day30
c语言·开发语言
玖玥拾5 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽5 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩5 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
2601_951643885 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出
m0_547486666 天前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计
✎ ﹏梦醒͜ღ҉繁华落℘6 天前
编程基础 --高内聚,低耦合
c语言·单片机
QK_006 天前
C语言 static 关键字三大作用
c语言·开发语言
隔窗听雨眠6 天前
C语言函数递归从入门到精通(下):性能优化与工程实践
c语言·算法·性能优化