关键词:
【中文标题】如何使用指针检查数组中的某个位置是不是被修改【英文标题】: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,它会说它在数组中,如果不是,它应该打印“不在数组中”。
这必须使用指针来完成。
【问题讨论】:
Googlestd::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 它是int
s 的数组。将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<int, int> values
。真的可以是空的(values.empty()==true
)当你写values[2]=0
时,会添加一个新的值,values.size()
将是1
以反映新的元素数量。
【讨论】:
【参考方案3】:我不明白如何检查数组中的某个位置是否被修改。
在 x86 上,您可以在读取/写入/执行访问时设置硬件断点,以访问长度不超过 8 字节的特定地址处的值。在 Linux 上,一个 API 是 perf_event_open
和 PERF_TYPE_BREAKPOINT
事件类型。事件计数器的值是对该地址的值进行了多少次有趣的访问。
【讨论】:
是的,但是这个用户可能还没有到他们应该做那样的事情的时候。 @underscore_d 可能是,但知道方法存在仍然很有用。【参考方案4】:一个选项是使用两个数组。一个 bool
数组来存储初始化状态,另一个数组来保存所需的对象。
(不过 std::array
或 std::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。... 查看详情