字符指针算术C.

PTN*_*PTN 3 c char pointer-arithmetic

我正在学习指针算术,我遇到了这样的事情:

char *str1, *str2;

/* stuff in between */

int f = str2 - str1;
Run Code Online (Sandbox Code Playgroud)

什么str2 - str1回来了?比方说str1 = "foo"str2 = "foobar".

Who*_*aig 12

您提出问题的结果未定义.要使指针差异正常工作,它们必须来自相同的数组序列(动态,自动,甚至自动VLA没有区别).或过去最后一个元素的过去地址:

§6.5.6加法运算符(p9)

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素 ; 结果是两个数组元素的下标的差异.结果的大小是实现定义的,其类型(有符号整数类型)ptrdiff_t<stddef.h>头文件中定义.如果结果在该类型的对象中无法表示,则行为未定义.换句话说,如果表达式PQ指向,分别为i-thj-th的阵列对象的元素,表达式(P)-(Q)的值为I-J提供的值在类型的对象适合ptrdiff_t.此外,如果表达P点或者到一个数组对象或一个过去的阵列对象的最后元件,并且表达的元件Q指向相同的数组对象的最后一个元素时,表达((Q)+1)-(P)具有相同的值((Q)-(P))+1和作为-((P)-((Q)+1)),具有如果该值为零表达式P指向数组对象的最后一个元素之后的一个,即使该表达式(Q)+1未指向数组对象的元素.106

也就是说,如果你改写以符合上述规则,那就像:

#include <stdio.h>
int main()
{
    const char *p = "Hello World";
    const char *q = p+7;
    printf("%td\n", q-p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量

7
Run Code Online (Sandbox Code Playgroud)

并且从标准的引用部分解释了原因.