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

     2023-02-17     279

关键词:

【中文标题】如何使用指针检查数组中的某个位置是不是被修改【英文标题】: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 对象。

【讨论】:

Firestore 安全规则 - 如何检查某个字段是不是被修改?

】Firestore安全规则-如何检查某个字段是不是被修改?【英文标题】:FirestoreSecurityRules-HowcanIcheckthatafieldis/isn\'tbeingmodified?Firestore安全规则-如何检查某个字段是否被修改?【发布时间】:2018-06-1823:46:38【问题描述】:对于我的一... 查看详情

如何检查某个表是不是正在被 AWS Redshift 上的某个程序或视图使用

】如何检查某个表是不是正在被AWSRedshift上的某个程序或视图使用【英文标题】:HowtocheckifatableisinusebysomeprocedureorviewonAWSRedshift如何检查某个表是否正在被AWSRedshift上的某个程序或视图使用【发布时间】:2021-10-1905:44:43【问题描述... 查看详情

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

】Flutter&Firebase:如何检查某个项目是不是存在于Firebase文档中的数组中【英文标题】:Flutter&Firebase:HowtocheckifanitemexistsinsideofanarraywithinaFirebasedocumentFlutter&Firebase:如何检查某个项目是否存在于Firebase文档中的数组中【发... 查看详情

如何创建一个带锁的指针数组并检查指针是不是空闲?

】如何创建一个带锁的指针数组并检查指针是不是空闲?【英文标题】:Howtocreateanarrayofpointerswithlockandcheckthepointerfreeornot?如何创建一个带锁的指针数组并检查指针是否空闲?【发布时间】:2019-09-1908:37:09【问题描述】:我有一... 查看详情

如何检查大型镶木地板文件中的列是不是已被修改?

】如何检查大型镶木地板文件中的列是不是已被修改?【英文标题】:Howtocheckifcolumnsinalargeparquetfilehavebeenmodified?如何检查大型镶木地板文件中的列是否已被修改?【发布时间】:2020-01-1100:28:33【问题描述】:我经常在大型parquet... 查看详情

如何检查数组中的值是不是存在于数组变量中? [复制]

】如何检查数组中的值是不是存在于数组变量中?[复制]【英文标题】:Howtocheckvalueinthearrayispresentinthearrayvariableornot?[duplicate]如何检查数组中的值是否存在于数组变量中?[复制]【发布时间】:2019-12-2717:24:48【问题描述】:我想... 查看详情

如何检查谁使用 C# 中的某个端口?

...口80正在使用什么进程/什么可执行文件?我想知道,比如是不是ApacheServer等等。我们可以从ipProperties.GetActiveTcpListeners()获得一些信息吗?我只看到了本地端点、远程端点和状态。【问题讨论】: 查看详情

20171009

1.字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。字符串内部的单个字符无... 查看详情

如何检查某个位置的字符串是不是包含字符 a-h?

】如何检查某个位置的字符串是不是包含字符a-h?【英文标题】:Howtocheckifastringatacertainpositioncontainscharactera-h?如何检查某个位置的字符串是否包含字符a-h?【发布时间】:2014-03-0211:57:44【问题描述】:我知道肯定有更简单的检... 查看详情

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

】如果某个值存在于某个数组索引处,我如何检查JavaScript?【英文标题】:HowdoIcheckinJavaScriptifavalueexistsatacertainarrayindex?【发布时间】:2011-02-0923:19:06【问题描述】:这是否适用于测试位置index的值是否存在,或者是否有更好的... 查看详情

检查数组是不是包含另一个数组及其在 DART/Flutter 中的位置

】检查数组是不是包含另一个数组及其在DART/Flutter中的位置【英文标题】:checkifarraycontainsanotherarrayanditspositioninDART/Flutter检查数组是否包含另一个数组及其在DART/Flutter中的位置【发布时间】:2021-11-2911:29:24【问题描述】:在dart... 查看详情

Mongoose:如何通过 model.findOneAndUpdate() 检查文档是不是被修改

】Mongoose:如何通过model.findOneAndUpdate()检查文档是不是被修改【英文标题】:Mongoose:howtocheckifdocumentismodifiedviamodel.findOneAndUpdate()Mongoose:如何通过model.findOneAndUpdate()检查文档是否被修改【发布时间】:2016-05-0517:11:06【问题描述】... 查看详情

android,检查gps位置是不是接近/接近某个位置

】android,检查gps位置是不是接近/接近某个位置【英文标题】:android,checkgpspositionifnear/closetocertainpositionandroid,检查gps位置是否接近/接近某个位置【发布时间】:2012-08-2320:36:56【问题描述】:我有带有gps位置(纬度和经度)的sql... 查看详情

如何使用forAll检查数组中的所有字符串是不是以大写字母开头?

】如何使用forAll检查数组中的所有字符串是不是以大写字母开头?【英文标题】:HowtocheckifallstringsinanarraystartwithuppercaseletterusingforAll?如何使用forAll检查数组中的所有字符串是否以大写字母开头?【发布时间】:2019-09-2522:01:55【... 查看详情

使用object.defineproperty如何巧妙找到修改某个变量的准确代码位置(代码片段)

前言本文主要给大家介绍的是关于使用Object.defineProperty巧妙找到修改某个变量的准确代码位置的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧语法Object.defineProperty(obj,prop,descriptor)参数obj需要定... 查看详情

检查数组是不是包含某个对象

】检查数组是不是包含某个对象【英文标题】:Checkifthearraycontainsacertainobject检查数组是否包含某个对象【发布时间】:2016-03-0110:10:46【问题描述】:我想知道如何在从firebase检索数据后检查数组是否包含某个值。我检索数据并将... 查看详情

C ++如何检查数组中的元素是不是相等?

】C++如何检查数组中的元素是不是相等?【英文标题】:C++howtocheckifelementsinanarrayareequal?C++如何检查数组中的元素是否相等?【发布时间】:2015-09-0406:02:13【问题描述】:我正在尝试编写一个程序,该程序使用for循环检查数组中... 查看详情

ubuntu如何判断某个端口是不是被隐藏

在Ubuntu中,可以使用netstat命令来判断某个端口是否被占用。使用netstat-tuln命令查看所有正在监听的端口。这将显示所有正在使用中的TCP和UDP端口。使用netstat-tulnp命令查看所有正在监听的端口,并显示正在使用该端口的进程ID。... 查看详情