我正在实现一个循环队列,当队列已满时,我希望指针返回到数组地址的第一个。
struct Sample{
void* ptr;
};
int main() {
char a[20] = "hello";
struct Sample sample;
sample.ptr = (a + 2) % 6;
printf("%s\n", sample.ptr);
}
编译代码时,出现以下错误:
invalid operands to binary % (have ’char* ’ and ‘int’)
我知道问题来自%
,例如,如果我将第12行更改为sample.ptr = (a + 2)
,它将起作用。但我需要评估%
。我怎么能这样做?
答案 0 :(得分:5)
sample.ptr = (a + 2) % 6;
a
是一个char*
(即一个内存地址),添加2就可以了 - 这将在内存中进一步指向chars
。
但是做一个%
(模数)(即使它工作)当然会创建一个无效的指针。
sample.ptr
会指向内存地址0到5(0是NULL pointer
),这可能不是你想要的。
<强>更新强>:
我正在实现一个循环队列,当队列已满时,我想要 指针返回到数组地址的第一个
要实施循环队列,您可以使用:
sample.ptr = a + (pos % number_of_items_in_array); // brackets not really needed
或者:
sample.ptr = &a[pos % number_of_items_in_array];
sample.ptr
也应该是char*
,而不是void*
:
struct Sample{
char* ptr;
};
答案 1 :(得分:3)
如果您要实现循环队列,则需要对数组的索引使用模运算符,而不是数组的地址:
sample.ptr = a + (2 % 6);
在这种情况下,索引2
恰好是常量,但您可以在其中放置任何值,ptr
将指向[0]和[5]之间的某个位置。
编辑:
正如评论中所提到的,使用数组语法更清晰:
sample.ptr = &a[2 % 6];
由于ptr
被定义为void *
,因此您无法使用数组语法,因为元素大小未知。您可以将定义更改为char *
,这将允许此语法起作用。
答案 2 :(得分:0)
如果将a设置为数组而不是指针和增量索引,modolo将起作用
a[index++] = new_value;
index %= maxindex;
这应该允许循环工作并使索引正确旋转。 您可以将sample.ptr设置为&amp; a [index]。