鉴于此代码:
int *p, *q;
p = (int *) 1000;
q = (int *) 2000;
什么是q - p
以及如何?
答案 0 :(得分:32)
根据标准,它实际上是未定义的。除非指针指向同一个数组中的元素或者指向同一个数组之外的元素,否则不能保证指针算法有效。
标准的相关部分是6.5.6:9(c1x的n1362草案,但自c99以来没有变化),其中说明:
当减去两个指针时,两个指针都指向同一个数组对象的元素, 或者超过数组对象的最后一个元素;结果是差异 两个数组元素的下标。
如果int
数据类型为4个字节,则最有可能得到250,但不能保证。未定义的行为(与实现定义的行为不同)意味着未定义。任何事情都可能发生,包括大部分时空的完全破坏。
进修课程:
答案 1 :(得分:8)
q - p是250。
2000 - 1000 = 1000
1000 / sizeof(int) = 250
指针算术,假设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;
也就是说,在这种情况下,两个指针之间的差异是它们之间的数组元素的数量。在这种情况下,它是0,1,... 8或9个元素。
答案 2 :(得分:2)
q-p
应该返回从p
到q
应增加的步数。哪个是1000 / sizeof(int)
并且等于250.记住q++
实际上将转到int类型的下一个元素,而不是它的中间,所以它应该将4添加到指针的实际值。因此结果。
答案 3 :(得分:2)
答案:
q-p将是250,假设你在一台int
是4字节的机器上。
计算结果如下:
q - p = 1000 1000/4(int的大小)= 250
背后的想法:
指针算法背后的想法是,如果你有一个指向1000的int
指针和指向2000的int
指针,并且要求区别,那么你不问什么是2000-1000。您要问的是,我可以在两者之间放置多少int
。
这对各种操作都非常方便,例如:
int *i = 100;
i++; // This is **not** 101, it is 104, cause you actually want the next place an int could fit in memory.
这在处理数组时特别有用。一组int(定义为int arr[10]
)基本上被视为指针。当您编写arr[5]
时,编译器会将其转换为*(arr + 5)
,即将{5}添加到名为int
的{{1}}指针,并获取该地址的值。
这种方法起作用的原因是因为arr
不意味着“将arr的值加5”,这意味着“将所需的任何内容添加到arr的值中以继续前进” 5 arr + 5
s“,或者更确切地说,”将5 * int
添加到arr的值“
答案 4 :(得分:-7)
当p指向int,因此q,q-p将为1000。