繁体   English   中英

在C中将模运算符与指针一起使用

[英]Using the modulo operator with pointers in C

如果我有一个char指针,例如char *ptr ,该指针保存一个ascii字符的地址,并且想对该地址使用取模运算符,我该怎么做? 每当我尝试使用诸如int modulo = ptr % 16类的基本操作来执行此操作时,都会收到错误消息“ invalid operationnds to binary%”(二进制无效的操作数),因此我对二进制算术的掌握不强,所以我知道我需要继续发展这一技能,但是如果有人可以告诉我我在这里缺少什么概念,那将对您有很大的帮助,谢谢。

编辑:对不起,我不清楚我要完成什么,但是基本上我只需要显示一个带有16个插槽的内存块。 它是一个程序,在该程序中我已经完成了在数组中找到一个ascii字符的操作,然后显示了存储该ascii字符的内存块。 现在运行它时,它将显示找到的ascii字符以及找到的字符之后的15个字符及其存储位置。 代替执行此操作,如果找到的ascii字符位于内存块的中间,则我需要它来显示存储在它周围的内容,而不仅仅是显示它之后的内容。 因此,就像找到的字符在阵列的23个插槽中一样,程序将显示阵列的插槽16-31中的字符和存储位置。

您需要临时将其强制转换为适当的宽整数,例如

#include <stdint.h>

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

当然,生成的指针是否具有实际用途是另一回事。

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

正如Paul的回答所提到的,您可以将指针转换为整数(在<stdint.h>定义的uintptr_t是最佳选择),然后将%应用于结果,但不能保证它表示任何含义。 实际上,我在系统上工作过,其结果并不意味着您可能期望的含义,因为指针具有不寻常(但完全有效)的表示形式。

您只需要说明您要完成的任务。 (我可以猜测,但我不愿意尝试。)我们可能会帮助您(尽管可能没有便携式解决方案)。

更新:

由于您要处理数组的元素,因此无需使用指针算术(至少不是直接玩)进行游戏。

在您的示例中,给定索引值为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节在解释它方面做得很好。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM