在C中使用带有指针的模运算符

时间:2014-03-26 20:25:40

标签: c pointers modulo pointer-arithmetic

如果我有一个字符指针,比如说char *ptr,它包含一个ascii字符的地址,并想在该地址上使用模运算符,我该怎么做?每当我尝试使用int modulo = ptr % 16等基本操作执行此操作时,我会收到错误“无效操作数为二进制%”我对二进制算术的掌握很弱,所以我知道我需要继续开发此技能,但是如果有人能告诉我我在这里缺少什么概念那将是一个很大的帮助,谢谢。

编辑:对不起我对我想要完成的事情不太清楚,但基本上我只需要显示一个有16个插槽的内存块。它是一个程序,在数组中找到一个ascii字符,我已经完成了,然后显示存储该ascii字符的内存块。当我现在运行它时,它会显示找到的ascii字符以及找到字符后的15个字符及其内存位置。而不是这样做,如果找到的ascii字符位于内存块的中间,我需要它来显示存储在它周围的内容,而不仅仅是它之后的内容。因此,如果找到的字符位于数组的23个插槽中,程序将显示数组插槽16-31中的字符和内存位置。

2 个答案:

答案 0 :(得分:4)

您不能将%应用于指针,不能超过字符串的平方根。指针不是数字。

您可以,如Paul's answer所述,将指针转换为整数(uintptr_t,在<stdint.h>中定义,是最佳选择),然后将%应用于结果,但不保证它意味着什么。事实上,我已经研究过结果意味着你可能期望它的意思的系统,因为指针有一个不寻常的(但是完全有效的)表示。

你需要解释你想要完成的事情。 (我猜,但我不想尝试。)我们可以帮助你(尽管可能没有便携式解决方案)。

更新:

由于你正在处理数组的元素,所以不需要使用指针算法来玩游戏(至少不是直接)。

在您的示例中,如果索引值为23,则需要显示元素16到31.您可以通过对索引值执行整数算法来轻松完成此操作。例如(未经测试的代码如下):

char arr[256];
int index = 23;
int start = index - (index % 16);
int end = start + 15;
for (int i = start; i <= end; i ++) {
    /* whatever */
}

(C中数组和指针之间的关系可能令人困惑。comp.lang.c FAQ的第6节在解释它时做得很好。)

答案 1 :(得分:3)

您需要暂时转换为适当宽度的整数,例如

#include <stdint.h>

ptr = (char*)((uintptr_t)ptr % 16);

结果指针是否具有实际用途是另一回事。