【问题标题】:Confused Regarding Incrementing Pointer with ++对使用 ++ 递增指针感到困惑
【发布时间】: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 &lt;&lt; n &lt;&lt;"::"&lt;&lt; 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++ 之后在控制台上,所以你会看到相同的十六进制值

标签: c++ pointers syntax c++17


【解决方案1】:
*n++ = 10;

相同
*n = 10; n += 1;

因此,实际上您将数组的第一个元素设置为10,然后递增n 以指向数组的第二个元素。那么

std::cout << n << " :: " <<  *n << std::endl; 

将打印数组的second 元素的地址和值。由于您从未为其分配任何内容,因此它的值是不确定的,并且会发生技术上未定义的行为。


最后一段代码更有趣:

std::cout << n <<"::"<< n++ ;

这是 C++17 之前未定义的行为。并且将使用 C++17 或更高版本打印两次相同的值。都是关于序列点的。

请参阅this question 了解一般概述,this question 几乎是它的副本。

【讨论】:

  • 与您提供的std::cout &lt;&lt; n &lt;&lt;"::"&lt;&lt; n++;中的序列点无关;您提供的第二个链接下提供了一些详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多