2017-01-06 21 views
1

假设你有一个指向数组中的int的指针。这是找出指针指向哪个数组的哪个项目的最佳方法?从C++数组元素的指针获取索引的最快方法是什么?

int nmbr = pointer - &array[0]; 
cout<<"Item number "<<nmbr+1; 

如果指针指向第6项,是否总是打印“项号6”?这容易出错吗?有没有更快的方法来做到这一点?迭代数组将无法工作,因为可能存在重复值,但这是否始终有效?在这种情况下,我们假设数组从第0项开始到第x项。是否有这样一种情况,其中一个数组的项目不存储在一个连续的行(如果该数组初始化为int array[x];)?

+3

更通用的:'COUT <<的std ::距离(数组,指针)+ 1;' – PaulMcKenzie

+0

@PaulMcKenzie'std :: begin(array)',如果你想要它是通用的:) – BoBTFish

回答

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; 
    } 
} 
2

两个+ 1的外观都不对.. 但是,这是最快和最简单的方法。它保证工作。

+0

+ 1是因为我想它输出从1开始的项目号码,而不是从0开始,谢谢你的答案。编辑:对不起,没有注意到我有两个+ 1!再次感谢! – theo2003

+0

@Frank Puffer:意外。 – theo2003

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

相关问题