如何检查数组中元素的位置?
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 && timer[i].somethingelse != timer.somethingelse ....)
。或者比较元素的地址。 “正确性”取决于 您想要 具有的语义(元素相等是否意味着元素内容相同?还是意味着它是完全相同的元素?)。我只能猜测比较地址&timer_array[i] == timer
是你想要的。无论如何,没有什么能让你免于理解它——我建议从一本好的 C 书开始。
我建议sizeof(timer_array) / sizeof(*timer_array)
而不是文字6
。【参考方案2】:
如果你确定回调参数指向数组的某个元素,那么你可以用简单的指针算法来索引:idx = timer_ptr - timer_array
。
但如果它不指向数组,那么这将导致未定义的行为。
【讨论】:
以上是关于如何检查数组中元素的位置?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查数组是不是有足够的位置来接受 Java 中数组的新值?
检查数组是不是包含另一个数组及其在 DART/Flutter 中的位置