求助:一段C++指针运算程序的逻辑解析疑问
解析这个C++程序的输出逻辑
首先先把你提供的代码贴出来方便分析:
#include <iostream> using namespace std; int main() { int t[4] = { 8, 4, 2, 1 }; int *p1 = t + 2, *p2 = p1 - 1; p1++; cout << *p1 - t[p1 - p2] << endl; return 0; }
我来一步步拆解每一步的指针操作和计算逻辑,结合你给出的地址与对应值来解释:
数组与指针初始化
- 数组
t的元素分别是:t[0] = 8,t[1] = 4,t[2] = 2,t[3] = 1。 - 初始时
p1 = t + 2:t是数组首地址,t+2指向数组的第3个元素(下标从0开始),也就是t[2],对应值为2。 p2 = p1 - 1:指针减1会向前移动一个int元素的位置,所以p2指向t[1],对应值为4,和你给出的p2地址存储值一致。
- 数组
指针自增操作
p1++:指针自增1,会向后移动一个int元素的位置,此时p1指向t[3],对应你给出的地址0x00000007c2affa24,存储的值是1。
关键表达式计算
现在来看输出的核心表达式:*p1 - t[p1 - p2],这里要注意运算符优先级,先计算*p1和t[...],再做减法:*p1:当前p1指向t[3],所以取值为1。p1 - p2:指针相减的结果是两个指针之间的元素个数,不是字节数。你给出的p1地址是0x00000007c2affa24,p2是0x00000007c2affa1c,两者字节差是0x24 - 0x1c = 8,而int占4字节,所以元素个数是8 / 4 = 2,也就是p1 - p2 = 2。t[p1 - p2]就是t[2],对应的值是2。- 最后计算
1 - 2 = -1,这就是程序的输出结果。
内容的提问来源于stack exchange,提问作者Lavakusa
相关产品推荐
相关产品推荐

