向char添加指针

向char添加指针,c,pointers,mingw,addition,C,Pointers,Mingw,Addition,我怀疑出于可移植性的原因,添加指针是在对实现进行基本假设,但有人能解释一下为什么在MinGW GCC下,由于以下错误,我无法执行以下操作吗 “二进制+的操作数无效(具有char*和char*)” 然而,如果我稍微操纵一下代码,我就可以侥幸逃脱 char *cbase; char *ep; int temp; temp = cbase; tbase = ep + temp; 我知道我正在做一些关于指针实现的假设,但我的观点是为什么编译器不能为我解决它?TL;DR-不能添加两个指针 指针是内存地

我怀疑出于可移植性的原因,添加指针是在对实现进行基本假设,但有人能解释一下为什么在MinGW GCC下,由于以下错误,我无法执行以下操作吗

“二进制
+
的操作数无效(具有
char*
char*
)”

然而,如果我稍微操纵一下代码,我就可以侥幸逃脱

char *cbase;
char *ep;
int temp;

temp = cbase;
tbase = ep + temp;

我知道我正在做一些关于指针实现的假设,但我的观点是为什么编译器不能为我解决它?

TL;DR-不能添加两个指针

指针是内存地址。试想一下,即使允许您添加两个指针,结果的意义是什么?它会产生一个无效的值,不是吗

OTOH,您可以向指针添加
int
。这就像通过移动那么多元素来生成地址一样

此外,根据
C11
标准,第§6.5.6章,加法运算符(重点)

此外,两个操作数都应具有算术类型,或者一个操作数应为指向完整对象类型的指针,另一个操作数应具有整数类型。(递增是 相当于增加1。)


添加两个指针很可能会生成无效指针,因此这是不允许的,但向指针添加一个整数是完全有效的,它将使指针递增,即,生成的指针很可能是有效的,除非您添加一个值,使其指向最初指向的内存块之外

您不能添加指针,但可以计算指针差异,例如,它们与距离类似

char *source = "Some text for a test";
char *head = strstr(source, "text");
char *tail = strstr(source, "for");
size_t length = tail - head - 1;

将为您提供
文本的长度
,以便您可以计算指针差异。

谢谢。我正在移植一个旧的小型C应用程序,因此从80年代开始,标准似乎有了一些进展。可以说,通过使用和int来保存地址,我实现了我想要的目标——但我现在理解了标准。是的,您关于代码无效性质的观点是正确的。由于小型c编译器的限制,原作者使用指针作为无符号整数。@Alex不客气。:-)顺便说一下,你可以考虑一个帮助你的答案。谢谢IHAROB -这很聪明。我可以使用它,它将解决我的问题。@Alan甚至有一种特殊类型的指针差异
ptrdiff\u t
。我不能太多地偏离小型C语言,除非我添加库函数,因为我需要编译编译器,但我想接近标准,因此首先移植到MinGW GCC。为此,对于像Linux这样的程序员来说,你可以在一个更好的环境中工作,使用gcc和
-std=c11
或者任何你想要坚持的标准。我没有意识到这一点。谢谢
char *source = "Some text for a test";
char *head = strstr(source, "text");
char *tail = strstr(source, "for");
size_t length = tail - head - 1;