【问题标题】:setting value doesn't work when iterating array by pointer increment通过指针增量迭代数组时设置值不起作用
【发布时间】:2021-04-02 17:40:39
【问题描述】:

在example1中,设置元素由[]操作符完成,获取元素由指针递增*(data++)完成,看起来效果不错。另一方面,在 example2 中,设置和获取元素都是通过指针递增完成的,似乎不起作用。从这个比较中,我可以猜到指针增量似乎与元素设置不兼容。

您能否解释一下为什么会发生这种情况以及如何解决这个问题?

#include<iostream>
int main(){
  {
    std::cout << "=== example 1 ===" << std::endl; 
    int* data = new int [6];
    for(int i=0; i<6; i++){
      data[i] = i;
    }
    for(int i=0; i<6; i++){
      std::cout << *(data++) << std::endl; 
    }
  }
  {
    std::cout << "=== example 2 ===" << std::endl; 
    int* data = new int [6];
    for(int i=0; i<6; i++){
      *(data++) = i;
    }
    for(int i=0; i<6; i++){
      std::cout << *(data++) << std::endl; 
    }
  }
}

输出

=== example 1 ===
0
1
2
3
4
5
=== example 2 ===
60753
0
0
0
0
0

【问题讨论】:

  • 在第二段代码中,在第一段之后:你认为data会指向哪里?下次增加它时它会指向哪里?
  • 啊,我明白了
  • 附带说明:这两个示例都在泄漏内存,因为您没有 delete[]'ing 分配由 new[] 分配的数组。这两个示例都丢失了指向该数组的原始指针。

标签: c++ pointers iterator


【解决方案1】:

您正在更改data,然后再次使用它,就像您没有更改它一样。只需声明一个新变量

    std::cout << "=== example 2 ===" << std::endl; 
    int* data = new int [6];
    int* ptr = data;
    for(int i=0; i<6; i++){
      *(ptr++) = i;
    }
    ptr = data;             // move ptr back to the beginning of data
    for(int i=0; i<6; i++){
      std::cout << *(ptr++) << std::endl; 
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 2011-08-15
    • 1970-01-01
    • 2019-10-05
    • 2016-12-11
    • 2018-12-06
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多