【发布时间】:2021-08-29 08:40:48
【问题描述】:
所以我几乎是一个初学者,但我偶然发现了一些让我感到困惑的东西。
int* p = new int[3];
//Now I want to increment the Pointer and add value 10 there.
int* n = new int[3];
std::cout << n << std::endl;
*n++=10;
std::cout << n << " :: " << *n << std::endl;
return 0;
但是,第二个 std::cout @ * n 上打印的内容为零,而不是预期的 10。指针地址似乎成功增加了 4 个字节,但值没有增加。我究竟做错了什么?对 *n+1 = 10 做同样的事情;按预期工作。
int main()
{
int* n = new int[3];
std::cout << n << std::endl;
*(n+1)=10;
std::cout << n << " :: " << *(n+1) << std::endl;
return 0;
}
我还注意到输出以下内容
int main()
{
int* n = new int[3];
std::cout << n <<"::"<< n++ ;
}
现在在 n++ 打印上,我希望十六进制值增加了 4,但实际上减少了 4。这是为什么呢?我预计它比 n 大 4,但 n++ 小 4。如果我这样做,地址似乎变大了?我真的很困惑
【问题讨论】:
-
你确定用 C++17 编译吗?在 C++17 中,
std::cout << n <<"::"<< n++;应该打印两次相同的值,而之前它是未指定的或 UB。 -
*n++=10;首先将 10 加到*n,然后增加n(与*n+=10; n+=1;相同)。如果您想要相反的顺序,请尝试*++n=10;(更好的是,根本不要这样做,它们会令人困惑且容易出错)。 -
@ * n?认真的吗?
-
代码中的问题是
n++和++n之间的区别,n++只需首先产生 n 值,然后增加它,所以你正在分配10 到n[0],然后++运算符在n之后增加它,所以当您打印*n时,您正在将n[1] 打印到控制台但您更改了n[0],您应该使用++n,因为它首先增加指针然后使用它。 -
在最后一个问题中,'n++' 和 '++n' 的规则仍然相同,所以我认为你应该两次相同的值,因为真正的指针增量发生在打印
n++之后在控制台上,所以你会看到相同的十六进制值