第一段代码
int updates = 6;
int *p_updates; // 声明指针
p_updates = &updates; // 赋值
首先声明并初始化了一个整型变量 updates,其值为 6。
然后声明了一个指向整型的指针 p_updates,但此时它没有被初始化,也就是说它没有指向任何有效的内存地址。
最后一行将 updates 的地址赋给了 p_updates,使 p_updates 指向了 updates 变量。
第二段代码
int updates = 6;
int *p_updates = &updates; // 声明并初始化
同样首先声明并初始化了一个整型变量 updates,其值为 6。
在第二行同时声明了一个指向整型的指针 p_updates 并将其初始化为 updates 的地址。这意味着 p_updates 在声明的同时就被赋予了一个有效的内存地址,指向了 updates 变量。
✅ 二、这两段代码的含义和结果是否一样?
比较项 | 是否相同 |
---|---|
最终效果 | ✅ 完全一样 |
p_updates 的指向 | ✅ 都指向了 updates 变量 |
内存布局 | ✅ 完全一致 |
编译后的机器码 | ✅ 几乎完全一致(可能有极小优化差异) |
✅ 三、那它们的区别在哪?
虽然最终行为一致,但它们在语法结构上是有区别的:
区别点 | 分开写(示例1) | 合并写(示例2) |
---|---|---|
声明和赋值是否分离 | ✅ 是 | ❌ 否 |
可读性 | 更适合新手理解 | 更适合熟悉语法的人 |
是否可以延迟赋值 | ✅ 可以 | ❌ 必须立即赋值 |
是否能避免野指针风险 | ❌ 如果中间用了未赋值的指针会有风险 | ✅ 初始化即有效,更安全 |
四、什么是“声明”和“初始化”?
声明(Declaration):告诉编译器这个变量存在。
int *p_updates; // 声明一个指针变量
初始化(Initialization):在声明时就赋予初始值。
int *p_updates = &updates; // 声明 + 初始化
赋值(Assignment):在声明之后再给变量赋值。
p_updates = &updates; // 赋值操作
✅ 五、为什么建议用 int *p_updates = &updates;?
减少野指针风险
如果你先声明指针但忘记赋值,后续使用会导致未定义行为。
初始化就赋值,保证指针一开始就是有效的。
更符合现代 C/C++ 编程风格
推荐在声明变量的同时进行初始化,提高代码可读性和安全性。
便于维护
看到一行就知道这个指针指向哪里,不用找后面的赋值语句。
✅ 六、总结一句话:
int *p_updates = &updates; 是一种 声明+初始化 的写法,而 p_updates = &updates; 是 单独赋值 的写法。
在功能上它们是等价的,但在代码风格和安全性上,初始化写法更好。