You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解析一段C语言程序的输出及指针运算逻辑

C语言代码解析与指针运算逻辑讲解

先看完整代码:

int x = 5;

int *p = &x;

printf("%u	%u\n",&x,p);

printf("%d\n",*(p++));

printf("%d\n",*p);

逐行解析输出与逻辑

初始变量状态

  • int x = 5;:定义一个整型变量x,赋值为5,系统会为x分配一块专属内存空间。
  • int *p = &x;:定义一个整型指针p,让它指向x的内存地址。此时p存储的地址和&x(x的地址)完全相同。

第一个printf输出

printf("%u %u\n",&x,p);
这行代码会输出两个无符号整数,分别是x的内存地址和指针p存储的地址,两个值完全一致。

注意:用%u打印地址并不符合C标准规范,标准格式符应为%p,但在多数平台上,%u也能输出地址的无符号整数形式。

第二个printf输出

printf("%d\n",*(p++));
这里的核心是后置自增运算符++的优先级与行为:

  • p++是先使用p当前的地址值,再对p执行自增操作。
  • 所以*(p++)的执行顺序是:先解引用p当前指向的地址(也就是x的地址),取出值5;然后让p的地址增加sizeof(int)的字节数(通常是4字节),指向x内存后面的一块区域。
  • 这一行的输出结果是5。

第三个printf输出

printf("%d\n",*p);
此时p已经指向了x内存之后的未定义区域——这块内存没有被我们的程序初始化或赋值,属于非法访问。所以这一行的输出是未定义行为:可能输出随机垃圾值,程序也可能直接崩溃,结果完全不可预料。

指针运算核心逻辑

  • 指针的自增/自减不是简单的地址加1或减1,而是根据指针指向的数据类型自动调整偏移量。比如int*类型的指针自增,地址会增加sizeof(int)的大小,目的是让指针指向同类型的下一个连续元素(比如数组中的下一个元素)。
  • 后置自增p++和前置自增++p的关键区别:
    • 后置p++:先使用当前指针的值,再执行自增
    • 前置++p:先执行自增,再使用自增后的指针值

内容的提问来源于stack exchange,提问作者Breathing Programming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:57:42