添加指向字符的指针
Adding pointers to chars
我怀疑出于可移植性的原因,添加指针正在对实现做出基本假设,但是有人可以解释为什么在 MinGW GCC 下我无法执行以下操作,因为出现以下错误
"invalid operands to binary +
(have char *
and char *
)"
char *cbase;
char *ep;
char *tbase;
tbase = ep + tbase;
然而,如果我稍微修改一下代码,我就可以逃脱
char *cbase;
char *ep;
int temp;
temp = cbase;
tbase = ep + temp;
我知道我正在对指针实现做一些假设,但我的意思是为什么编译器不能为我解析它?
TL;DR - 你不能添加两个指针。
指针是内存地址。试想一下,即使你本来允许添加两个指针,结果有什么意义?它会产生 mostly 一个 invalid 值,不是吗?
OTOH,您可以向指针添加 int
。这就像通过移动那么多元素来生成一个地址。
此外,根据 C11
标准,第 6.5.6 章,加法运算符(强调我的)
For addition, either both operands shall have arithmetic type, or one operand shall be a pointer to a complete object type and the other shall have integer type. (Incrementing is
equivalent to adding 1.)
添加两个指针很可能会生成无效指针,因此这是不允许的,但是向指针添加一个整数是完全有效的,它会增加指针,即生成的指针很可能是有效的,除非你添加一个值,使其指向最初指向的内存块之外。
你不能添加指针,但你可以计算指针差异,例如它们就像距离
char *source = "Some text for a test";
char *head = strstr(source, "text");
char *tail = strstr(source, "for");
size_t length = tail - head - 1;
会给你text
的长度,这样你就可以计算出指针的差异了。
我怀疑出于可移植性的原因,添加指针正在对实现做出基本假设,但是有人可以解释为什么在 MinGW GCC 下我无法执行以下操作,因为出现以下错误
"invalid operands to binary
+
(havechar *
andchar *
)"
char *cbase;
char *ep;
char *tbase;
tbase = ep + tbase;
然而,如果我稍微修改一下代码,我就可以逃脱
char *cbase;
char *ep;
int temp;
temp = cbase;
tbase = ep + temp;
我知道我正在对指针实现做一些假设,但我的意思是为什么编译器不能为我解析它?
TL;DR - 你不能添加两个指针。
指针是内存地址。试想一下,即使你本来允许添加两个指针,结果有什么意义?它会产生 mostly 一个 invalid 值,不是吗?
OTOH,您可以向指针添加 int
。这就像通过移动那么多元素来生成一个地址。
此外,根据 C11
标准,第 6.5.6 章,加法运算符(强调我的)
For addition, either both operands shall have arithmetic type, or one operand shall be a pointer to a complete object type and the other shall have integer type. (Incrementing is equivalent to adding 1.)
添加两个指针很可能会生成无效指针,因此这是不允许的,但是向指针添加一个整数是完全有效的,它会增加指针,即生成的指针很可能是有效的,除非你添加一个值,使其指向最初指向的内存块之外。
你不能添加指针,但你可以计算指针差异,例如它们就像距离
char *source = "Some text for a test";
char *head = strstr(source, "text");
char *tail = strstr(source, "for");
size_t length = tail - head - 1;
会给你text
的长度,这样你就可以计算出指针的差异了。