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 但不能保证.未定义的行为(与实现定义的行为不同)意味着未定义.任何事情都可能发生,包括大部分时空的完全破坏.
进修课程:
q - p是250.
2000 - 1000 = 1000
1000 / sizeof(int) = 250
Run Code Online (Sandbox Code Playgroud)
指针运算,假设sizeof(int)为4.
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个元素.