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

关于C指针基础的疑问:p=NULL与*p=NULL执行结果差异咨询

关于指针赋值p = NULL与*p = NULL的输出差异解析

嘿,这个问题抓得特别准,刚好是指针操作里最容易踩坑的点之一!我来给你把底层逻辑掰明白:

1. p = NULL:修改的是指针本身的指向

当你执行p = NULL时,你是把指针变量p自己的值设置成了NULL(在绝大多数系统里,NULL等价于地址0)。这时候p不再指向原来的目标对象了,变成了一个空指针。

如果这时候你试图访问*p(也就是空指针指向的内存),这属于C/C++标准里的未定义行为——标准没有规定这种操作的结果是什么,可能返回某个随机的垃圾值,可能直接触发程序崩溃,甚至在不同编译器/系统下表现完全不一样,所以你得到的是“不确定值”。

2. *p = NULL:修改的是指针指向的对象内容

而*p = NULL操作的是p当前指向的内存地址里的数据。这里的NULL本质是一个值为0的宏定义,所以这句话等价于把p指向的变量赋值为0。

只要p原本指向的是一块有效的内存(比如之前已经正确初始化指向了某个变量),那这个操作就是合法的,之后读取这个变量的值自然会得到0,所以程序输出0完全符合预期。

举个直观的例子帮你理解:

int x = 10;
int *p = &x; // p指向x的地址

p = NULL; // 现在p不再指向x,变成空指针
printf("%d", *p); // 未定义行为,输出不确定值

// 重新初始化p
p = &x;
*p = NULL; // 等价于x = 0
printf("%d", x); // 输出0,完全正常

总结一下:

  • p = NULL:改变指针的指向,让它变成空指针,后续访问*p是非法操作
  • *p = NULL:修改指针指向的对象的值,只要指针本身有效,这个操作就是安全的

内容的提问来源于stack exchange,提问作者Kevin Kuo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:11:33