返回数组中值的指针地址
Returning the pointer address of a value within an array
我需要在数组中找到匹配值的地址,如以下问题所述:
此函数在数组列表的长度元素中搜索值目标。它返回找到目标的索引,如果值不存在,则返回 -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::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
或其他 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((需要数组开始/结束的"地址",但你分配的是数组开始/结束的"值"。
您的start
和stop
变量必须是指针。例如:
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
函数,请注意,在这种情况下,begin
和end
只是返回指针,it
也将是上述代码中的指针。
正如其他答案所述,您的start
和stop
变量需要是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;
}
现场演示
- CUDA:统一内存和指针地址的更改
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 向指针地址添加 20 个字节偏移量
- 如何理解智能指针的底层指针地址?
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 返回数组中值的指针地址
- C++向指针地址添加 4 个字节
- 指针地址的内存偶尔更改了函数前和后返回
- 如何根据指针地址获取指针内容
- C++ 将指针地址传递给函数
- 直接从指针/地址访问数组的元素
- 如何在没有作弊引擎的情况下从其他应用程序获取指针地址?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 间接寻址运算符如何返回带有运算符重载的指针地址
- 使用已删除的指针地址.据我所知,
- 如何保护类外用户可以修改的指针地址?C++
- 多个调用构造函数将更改C 中的成员指针地址
- 类对象指针的向量:如何在指针地址获得价值?C 和SDL_RECT
- Visual Studio C 2K15-在指针地址上获取错误
- 指针地址和参考混乱