C指针算术

时间:2010-01-22 13:35:11

标签: c pointer-arithmetic

鉴于此代码:

int *p, *q;

p = (int *) 1000;
q = (int *) 2000;

什么是q - p以及如何?

5 个答案:

答案 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应该返回从pq应增加的步数。哪个是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添加到a​​rr的值“

答案 4 :(得分:-7)

当p指向int,因此q,q-p将为1000。