返回数组中值的指针地址

Returning the pointer address of a value within an array

本文关键字:指针 地址 数组 返回      更新时间:2023-10-16

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

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

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

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

我拥有的代码在这里,但我似乎无法让它工作:

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

应正确初始化开始和停止指针:

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

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

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

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

这样,您将不会有访问nullptr的危险。 如果打印负值,则表示target不在someArray中。

我会使用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或其他 STD 容器,您可以使用.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的搜索区域.

你的函数find((需要数组开始/结束的"地址",但你分配的是数组开始/结束的"值"。

您的startstop变量必须是指针。例如:

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

并小心使用线条

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

使用数组中没有的另一个值。这会导致访问冲突,因为您尝试取消引用nullptr

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

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

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

如果你有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只是返回指针,it也将是上述代码中的指针。

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

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

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

搜索应从检查start处的元素开始,到stop处结束,而不检查该值

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

//while (start <= stop)
while (start < stop)

进行此更改会在main()代码中创建新的 bug。someArray[9]是数组中的最后一个元素 (89(。 进行上述更改后,将不再比较此元素,将someArray[9]用于stop指针。 因此,如果您要调用find(89, start, stop),它将返回nullptr而不是someArray[9]的地址。 因此,您需要改为将stop设置为someArray[10]的地址:

int *stop = &someArray[10];

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

话虽如此,请尝试如下操作:

#include <iostream>
#include <cstddef>
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[10];
std::cout << "Enter a number to find: ";
int num;
std::cin >> num;
int *found = find(num, start, stop);
if (found)
std::cout << "Found at index " << static_cast<ptrdiff_t>(found - start);
else
std::cout << "Not found";
return 0;
}

现场演示