我需要在数组中找到匹配值的地址,如以下问题所述:
此函数在数组列表的长度元素中搜索值目标。它返回找到目标的索引;如果不存在该值,则返回-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;
}
答案 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::find
和std::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)
您的start
和stop
变量需要是指针。例如:
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
函数,请注意begin
和end
在这种情况下只会返回指针,而{{1 }}也是上面代码中的指针。
答案 6 :(得分:0)
正如其他答案所述,您的start
和stop
变量需要是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];