【问题标题】:Negative Indexing with arrays in C++ [duplicate]C ++中数组的负索引[重复]
【发布时间】:2021-06-27 09:50:46
【问题描述】:

我熟悉python的索引系统,但不熟悉C++的...所以请帮助我

我想对一个数组进行负索引...

我试过了

int myarray[5] = {1,2,3,4,5};
cout << myarray[-1];

但它正在生成一些非常大的数字,而不是该数组的一部分...

【问题讨论】:

  • myarray[-1] 正在访问数组中第一个元素之前 的元素。这是未定义的行为。实际上,您只是得到未初始化的堆栈垃圾。
  • 您可以使用sizeof 计算数组的大小,然后使用arr_size - 1 访问最后一个元素:int arr_size = sizeof(myarray) / sizeof(int); cout &lt;&lt; myarray[arr_size - 1];
  • @kiner_shah 请注意(1)sizeof 运算符的结果是 std::size_t,而不是 int,(2)在标准 C++ 中编写它的正确方法只是 std::size ,并且(3)您的技巧非常危险,因为一旦该数组衰减为指针,它将停止工作。我见过 许多 程序员,尤其是那些刚接触 C 或 C++ 的程序员。
  • @CodyGray,是的,我忘了,sizeof 返回size_t。不错的收获:-) 是的,sizeof 如果他们开始使用指针可能会成为问题。从 C++11 开始支持 std::size 吗?
  • 不,std::size 是 C++17 及更高版本。问题不是你“开始使用指针”,而是 C 风格的数组隐式衰减为指针,这意味着即使你不打算这样做,你最终也会使用指针!尤其是作为初学者。 @kiner_shah

标签: c++ arrays indexing


【解决方案1】:

您可能需要考虑使用 std::vector,它可以让您访问 .size(),因此要获取最后一个元素,您可以使用 .size()-1(假设非空)。

对于更高级但概念上更整洁的解决方案,您可能需要查看基于迭代器的解决方案,例如 .end() 或 .rend()。

std::vector<int> myArray = { 1,2,3,4,5};
std::cout << myArray[myArray.size()-1] << std::endl;

【讨论】:

  • 这是一个很好的建议,但如果您要回答这个问题,您需要从发布实际答案开始:为什么会看到观察到的行为?
  • 评论中已经回答了。随意编辑?
  • 在不相关的注释中,std::endl 是一个坏习惯。这会强制刷新流,这几乎是你想要的。当你想要换行时,只需执行&lt;&lt; '\n'
  • 对不起,兄弟...我是 C++ 新手,使用 vs 代码...您的答案对我不起作用...如果可能,请通过编辑您的答案将完整代码发送给我... . 从第一行到最后...谢谢
猜你喜欢
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2010-10-28
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多