如何使用指针检查数组中的某个位置是不是被修改

Posted

技术标签:

【中文标题】如何使用指针检查数组中的某个位置是不是被修改【英文标题】:How to check if certain position in array is modified using pointers如何使用指针检查数组中的某个位置是否被修改 【发布时间】:2019-11-12 11:05:06 【问题描述】:

我不明白如何检查数组中的某个位置是否被修改。下面是一个例子:

int array[5];

array[2] = 23;
array[4] = 23;

for (int i = 0; i < 5; ++i) 
    if (array[i] == ????)
        cout << "in array";
     else 
        cout << "not in array";
    

所以我想知道如何获得它,所以if 语句正在检查该项目是否已被修改。所以一旦我变成 2,它会说它在数组中,如果不是,它应该打印“不在数组中”。

这必须使用指针来完成。

【问题讨论】:

Google std::optional 如果您想要可能存在或不存在的东西。 “这必须使用指针来完成。”不再是了!指针应该用来指向,而不是表示可选性。无论如何,“修改与否”是什么意思?如果您正确地将它们全部初始化为零,那么您可以检查它们是否仍然为零。但是你不知道它们是否故意为零,可以这么说。我不清楚 VTC,因为不清楚您需要做什么或为什么。 因此,如果数据已添加到该位置。我不能将它们全部设为 0 的原因是 data[2] 可以设置为零。这意味着它会说整个列表都在数组中。 【参考方案1】:

这是未定义的行为,因为 array[0] 未初始化。那么当你在你的if 中比较它时,会发生什么?

您可以将它们全部初始化为您认为“未修改”的值,并检查该值。例如:

int array[5] = ; // initializes all elements to the default value for int, which is 0

然后,在你的if

if (array[i] != 0 ) 

如果您因为需要完整范围的int 值而不能这样做,那么您可以改用std::optional

#include <iostream>
#include <optional>
int main() 
    std::optional<int> array[5];

    array[2] = 23;

    array[4] = 0;

    for (int i = 0; i < 5; ++i) 
        if (array[i]) 
            std::cout << "in array" << std::endl;
        
        else  std::cout << "not in array" << std::endl; 
    

【讨论】:

将所有值设置为 NULL 然后检查项目是否为空会不会是个坏主意? @Pouria 它是ints 的数组。将int 设置为0 你无法区分0 = no value 和 value 0,这就是std::optional 很好解决的问题 @Pouria 无济于事。 int 对象只是表示某个整数值的位集合。如果不为此目的保留一些特殊值(例如答案中最初的 0),则无法判断该值是否已更改/设置。 @Pouria NULL 只是0 的宏或将转换为0 的东西,例如std::nullptr_t 甚至((void*)0)。听起来你想拥有像std::optional 这样的功能,我为此添加了一个示例。【参考方案2】:

你不能。在 C++ 中,无法确定对象是否未初始化。任何读取未初始化对象值的尝试都是未定义行为。它们实际上是只写的。

(您也可能对术语有疑问,或者缺乏理解。array[0] 从一开始就在数组中,只是尚未初始化。)

您可以改用std::map&lt;int, int&gt; values。真的可以是空的(values.empty()==true)当你写values[2]=0时,会添加一个新的值,values.size()将是1以反映新的元素数量。

【讨论】:

【参考方案3】:

我不明白如何检查数组中的某个位置是否被修改。

在 x86 上,您可以在读取/写入/执行访问时设置硬件断点,以访问长度不超过 8 字节的特定地址处的值。在 Linux 上,一个 API 是 perf_event_openPERF_TYPE_BREAKPOINT 事件类型。事件计数器的值是对该地址的值进行了多少次有趣的访问。

【讨论】:

是的,但是这个用户可能还没有到他们应该做那样的事情的时候。 @underscore_d 可能是,但知道方法存在仍然很有用。【参考方案4】:

一个选项是使用两个数组。一个 bool 数组来存储初始化状态,另一个数组来保存所需的对象。 (不过 std::arraystd::vector 会比使用普通数组更好,但这是一个不同的问题)

例如

constexpr unsigned int ArrayLen = 5;

bool isInitialized[ArrayLen] = false;
MyType myArray[ArrayLen];  // In your case `MyType = int`
...

// When setting/resetting update both arrays
void Set(int i, MyType obj)

    assert(i < ArrayLen);
    isInitialized[i] = true;
    myArray[i] = std::move(obj);

...

// check isInitialized array first before accessing an element
unsigned int targetIndex = 2;
if (isInitialized[targetIndex])

    auto& obj = myArray[targetIndex];
    // use `obj` ...
 else 
    // object in `targetIndex` is not initialized

C++17 中,您可以使用std::optional,这样就不需要单独维护初始化状态,而是将状态和对象都绑定到单个std::optional 对象。

【讨论】:

以上是关于如何使用指针检查数组中的某个位置是不是被修改的主要内容,如果未能解决你的问题,请参考以下文章

如何检查arraylist中的数组是不是包含某个值?

如果某个值存在于某个数组索引处,我如何检查 JavaScript?

Flutter & Firebase:如何检查某个项目是不是存在于 Firebase 文档中的数组中

请教下,怎么查到数组中,某个字符串,在数组中的索引位置?

如何检查数组是不是有足够的位置来接受 Java 中数组的新值?

如何检查 Firebase Firestore 的数组中是不是存在元素?