返回数组中值的指针地址

时间:2018-08-15 12:01:13

标签: c++

我需要在数组中找到匹配值的地址,如以下问题所述:

  

此函数在数组列表的长度元素中搜索值目标。它返回找到目标的索引;如果不存在该值,则返回-1。

int find(int target, int list[], int length) {
  for (int i = 0; i < length; ++i) {
      if (list[i] == target) return i;
  }
  return -1;
}
     

使用指针重写该函数以指示搜索范围。搜索应首先检查元素的开始,然后在停止处结束,而不检查该值。返回值应该是指向目标值位置的指针,或者如果不存在值则为空指针。

我的代码在这里,但我似乎无法使其正常工作:

#include <cstdlib>
#include <iostream>
using namespace std;

int* find(int target, int* start, int* stop)
{    
    while(start <= stop)
    {
        if (*start == target)
        {
            return start;
        }    
        start++;
    }

    return nullptr;
}

int main()
{
    int someArray[] = {3,10,19,7,3,45,123,4,9,89};

    int start = *someArray[0];
    int stop = *someArray[9];

    cout << *find(19, start, stop);
    return 0;
}

7 个答案:

答案 0 :(得分:1)

应该适当地初始化开始和停止指针:

int* start = &someArray[0];
int* stop = &someArray[9];

您还想知道index所在的数组的target(而不是target本身),因此必须更改行:

cout << *find(19, start, stop);

cout << find(19, start, stop) - someArray ;

通过这种方式,您将不会有访问nullptr的危险。 如果打印负值,则意味着target不在someArray中。

答案 1 :(得分:1)

我将使用std::findstd::distance来获取值的索引。

#include <iostream>
#include <algorithm>

int main() {
    const int someArray [] = {3,10,19,7,3,45,123,4,9,89};
    const int len = sizeof(someArray) / sizeof(int);

    const auto it = std::find(&someArray[0], &someArray[len], 19);

    std::cout << std::distance(&someArray[0], it);
    return 0;
}

或者如果您使用std::array或其他标准容器,则可以使用.begin().end()

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    const std::array<int,10> someArray = {3,10,19,7,3,45,123,4,9,89};     

    const auto it = std::find(someArray.begin(), someArray.end(), 19);

    std::cout << std::distance(someArray.begin(),it);
    return 0;
}

您可以使用

const auto start = someArray.begin() + value;

,同样使用stop浏览someArray的搜索区域。

答案 2 :(得分:0)

您的功能find()需要数组开始/结束的“地址”,但是您要分配数组开始/结束的“值”。

答案 3 :(得分:0)

您的startstop变量需要是指针。例如:

int *start = &someArray[0];
int *stop = &someArray[9];

请谨慎使用行

cout << *find(19, start, stop);

,其中包含另一个不在数组中的值。这会导致访问冲突,因为您尝试取消引用nullptr

答案 4 :(得分:0)

星号(*)取消引用指针。也就是说,它为您提供了该地址处的值。 “与”号(&)获取指向值的指针。起始和终止指针应该是第一个和最后一个值的地址。

如果您打开更多警告,则编译器可能会告诉您,您正在取消引用的对象不是指针,并且您将int值传递给需要指针的函数。

int *start = &someArray[0];
int *stop = &someArray[9];

答案 5 :(得分:0)

如果您具有C ++ 11(应该使用),那么std::end专用于数组。

您可以避免将数组大小硬编码为幻数9或写出sizeof(someArray)/sizeof(someArray[0])咒语(这本身至少比在sizeof表达式中硬编码类型更好) )。

#include <iostream>
#include <iterator>
#include <algorithm>

int main() {
    const int someArray [] = {3,10,19,7,3,45,123,4,9,89};

    const auto it = std::find(std::begin(someArray), std::end(someArray), 19);

    std::cout << std::distance(std::begin(someArray), it);
    return 0;
}

如果您想使用自定义的find函数,请注意beginend在这种情况下只会返回指针,而{{1 }}也是上面代码中的指针。

答案 6 :(得分:0)

正如其他答案所述,您的startstop变量需要是int*指针,并且您需要使用&地址运算符而不是{{ 1}}取消引用运算符以获取那些指针:

*

但是,您的代码中还有另一个更微妙的错误。如记录的要求所述:

  

搜索应从检查int *start = &someArray[0]; int *stop = &someArray[9]; 处的元素开始,到start处结束而不检查该值

但是您的代码正在检查stop处的值。这是因为您应该使用stop运算符,而应该使用<=运算符:

<

进行此更改,然后在您的//while (start <= stop) while (start < stop) 代码中创建一个新错误。 main()是数组中的最后一个元素(89)。进行上述更改之后,将someArray[9]指针使用someArray[9]时将不再比较此元素。因此,如果您要呼叫stop,它将返回find(89, start, stop)而不是地址nullptr。因此,您需要将someArray[9]设置为stop的地址:

someArray[10]

这与STL算法与迭代器范围(以及原始指针也是迭代器)一起工作的方式相当。结束迭代器始终表示“ 1-past-the-end”,并且永远不会取消引用,仅用于比较开始迭代器何时到达结束迭代器。出于类似的原因,C ++标准还明确允许获取指向数组的“ 1-past-the-end”的指针。

话虽如此,尝试这样的事情:

int *stop = &someArray[10];

Live Demo