假设您有一个指向数组中int的指针。这是找出指针指向哪个数组项的最佳方法吗?
int nmbr = pointer - &array[0];
cout<<"Item number "<<nmbr+1;
如果指针指向第6个项目,是否会始终打印&#34;项目编号6&#34;?这容易出错吗?有更快的方法吗?迭代数组因为可能重复的值而无法工作,但这总是有效吗?在这种情况下,我们假设数组从项目0开始到项目x。是否存在阵列的项目不是以连续的行存储的情况(如果数组初始化为int array[x];
)?
答案 0 :(得分:3)
假设已知pointer
指向array
的元素,
std::ptrdiff_t nmbr = pointer - array;
会做到的。如果指针未指向数组的元素,则行为未定义。 std::ptrdiff_t
在标准头<cstddef>
中声明,是实现定义的有符号整数类型。使用int
不是一个好主意,特别是对于大型数组,因为std::ptrdiff_t
可能能够表示比int
更大的值范围(如果值大于int
可以表示,将结果转换为int
也会产生未定义的行为。
代码中的+1
不正确,因为C ++中的数组索引是基于零的。
所有数组,在声明为
的意义上 some_type array[some_positive_value];
有连续的元素。请注意,C ++不支持C的VLA(可变长度数组),即在编译时必须知道some_positive_value
。
答案 1 :(得分:2)
两个+ 1看起来都错了.. 但是,这是最快最简单的方法。它保证有效。
答案 2 :(得分:1)
正如XTF所说,是的,它确保有效。但是,不需要获取第0个元素的地址,只需使用array
。
对于更通用的解决方案,这也适用于其他容器,您可以考虑以下示例:
#include <iostream>
#include <iterator>
#include <array>
int main()
{
{
int array[10];
int * p = &array[5]; // Somehow get a pointer to the sixth element
std::cout << std::distance(std::begin(array), p) << std::endl;
}
{
std::array<int, 10> array;
int * p = &array[5]; // Somehow get a pointer to the sixth element
std::cout << std::distance(std::begin(array), p) << std::endl;
}
}