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>头文件中定义.如果结果在该类型的对象中无法表示,则行为未定义.换句话说,如果表达式P和Q指向,分别为i-th和j-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)
并且从标准的引用部分解释了原因.