如何检查数组中元素的位置?

Posted

技术标签:

【中文标题】如何检查数组中元素的位置?【英文标题】:How can I check the position of an element on an array? 【发布时间】:2021-03-13 09:26:04 【问题描述】:

我有结构

struct timer_t; 

以及这些计时器结构的数组

timer_t timer[6];

我还有一个回调函数,它以数组元素为参数。

void timer_callback(timer_t *timer)

   //how can I check which position of the timer_t timer[6] is?

正如您在代码中看到的,我的问题是如何获取数组中的元素位置? 需要知道数组的哪个元素是 *timer。我可以在回调函数中获取计时器数组。 谢谢。

【问题讨论】:

嗯,我认为您需要遍历 timer[] 以搜索所需的属性。 数组在哪里定义?是局部变量还是全局变量? 我可以得到回调里面的数组。 您需要做的第一件事是给数组和参数赋予相同的符号名称,否则在timer_callback() timer 将引用并且数组将是无法访问(阴影)。 你可以为timer[6]注册一个单独的回调吗? 【参考方案1】:

你不能简单地“知道”位置,你可以传递数组并迭代它,或者传递元素所在的索引。取决于你在调用函数时知道元素在哪里与否,需要自行搜索。

编辑:如果函数内有数组:

// you will need a different array name as to not conflict
int i = 0;
while (i < 6 && *timer != timer_array[i]) i++;

if (i != 6) 
    // timer found

编辑:我建议在整个代码中使用 #define ARRAY_SIZE 6 而不是文字 6。或者更糟糕的是像sizeof(array)/sizeof(*array)这样的大小划分。

【讨论】:

我可以在回调中获取数组。但是,我该如何比较这些元素呢?这在循环内是否正确? if(timer[i]==timer) 中断;或 if(&timer[i]==&timer) 中断;作为最后一个元素在数组中的位置。 比较结构的内容。 if (timer[i].something != timer.somthing &amp;&amp; timer[i].somethingelse != timer.somethingelse ....)。或者比较元素的地址。 “正确性”取决于 您想要 具有的语义(元素相等是否意味着元素内容相同?还是意味着它是完全相同的元素?)。我只能猜测比较地址&amp;timer_array[i] == timer 是你想要的。无论如何,没有什么能让你免于理解它——我建议从一本好的 C 书开始。 我建议sizeof(timer_array) / sizeof(*timer_array) 而不是文字6【参考方案2】:

如果你确定回调参数指向数组的某个元素,那么你可以用简单的指针算法来索引:idx = timer_ptr - timer_array

但如果它不指向数组,那么这将导致未定义的行为。

【讨论】:

以上是关于如何检查数组中元素的位置?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何检查函数中元素的协变和逆变位置?

PHP如何在数组指定位置插入元素

如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置

是否有忽略 jest.js 中元素位置的数组相等匹配函数?