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

相关推荐
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言单片机基础 — 完整知识点手册(19)
c语言·单片机·学习
another heaven2 小时前
【C/C++ C++ 新特性中的那些内存优化的特性】
c语言·开发语言·c++
我叫洋洋2 小时前
Allegro 画布“垃圾显示“清理指南:把板子调成干净工作台(实战总结)
c语言·c++·单片机·嵌入式硬件·eda·嘉立创
wuminyu3 小时前
JVM规范学习总结-Class文件结构
java·linux·c语言·jvm·c++
H.莓飛4 小时前
【数据结构】归并与外排序
linux·服务器·c语言·开发语言·数据结构·visual studio
xiaobobo33304 小时前
关于c语言循环结构的一些思考
c语言·业务逻辑·流程控制·循环结构·移植+输入
Navigator_Z4 小时前
LeetCode //C - 1304. Find N Unique Integers Sum up to Zero
c语言·算法·leetcode
晓蛋4 小时前
C语言第1章概述.ppt
c语言·程序设计·概述·关键字·编译环境
学逆向的13 小时前
C 枚举变量
c语言·开发语言·网络安全
冷凝雨13 小时前
前导零、后导零、最高有效位、最低有效位计算(C)
c语言