C指针算术

NLV*_*NLV 13 c pointer-arithmetic

鉴于此代码:

int *p, *q;

p = (int *) 1000;
q = (int *) 2000;
Run Code Online (Sandbox Code Playgroud)

是什么q - p以及如何?

pax*_*blo 33

根据标准,它实际上是未定义的.除非指针指向同一个数组中的元素,或者仅指向同一个数组,否则不能保证指针算法有效.

该标准的相关部分是6.5.6:9(c1x的n1362草案,但自c99以来没有变化),其中规定:

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.

如果您的int数据类型是4个字节,则最有可能获得250 但不能保证.未定义的行为(与实现定义的行为不同)意味着未定义.任何事情都可能发生,包括大部分时空的完全破坏.

进修课程:

  • 定义的行为是标准规定的行为.实现必须这样做才能符合要求.
  • 实现定义的行为由实现决定,但必须清楚地记录该行为.如果您不太关心可移植性,请使用此选项.
  • 未定义的行为意味着任何事情都会发生.不要那样做!

  • 这是正确的答案,但我想每个人都想相信答案将是1000/sizeof(int)无论如何.那好吧! (4认同)

Ric*_*ton 8

q - p是250.

2000 - 1000 = 1000
1000 / sizeof(int) = 250
Run Code Online (Sandbox Code Playgroud)

指针运算,假设sizeof(int)为4.


编辑:好的,澄清一下.在C中,当两个指针属于同一类型时,它们之间的差异定义为它们之间指向类型的事物的数量.例如,

struct foo { int ar[1000]; } big[10];
char small[10];

struct foo *fs, *fe;
char *ss, *se;

fs = &big[0]; fe = &big[9];
ss = &small[0]; se = &small[9];

fe - fs == se - ss;
Run Code Online (Sandbox Code Playgroud)

也就是说,在这种情况下两个指针之间的差异是它们之间的数组元素的数量.在这种情况下,它是0,1,... 8或9个元素.