如何评估(int *)%int?

时间:2016-01-14 13:53:37

标签: c

我正在实现一个循环队列,当队列已满时,我希望指针返回到数组地址的第一个。

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),它将起作用。但我需要评估%。我怎么能这样做?

3 个答案:

答案 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]。

相关问题