4

我知道一元运算符 ++ 将数字加一。但是,我发现如果我在 int 指针上执行此操作,它会增加 4(我系统上的 int 的大小)。为什么这样做?例如,下面的代码:

int main(void)
{
  int *a = malloc(5 * sizeof(int));
  a[0] = 42;
  a[1] = 42;
  a[2] = 42;
  a[3] = 42;
  a[4] = 42;
  printf("%p\n", a);
  printf("%p\n", ++a);
  printf("%p\n", ++a);
  return 0;
}

将返回三个数字,每个数字相差 4。

4

9 回答 9

6

这就是 C 的方式 - 完整的解释在规范中,第 6.5.6 节加法运算符,第 8 段:

当一个整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向与原始元素偏移的元素,使得结果和原始数组元素的下标之差等于整数表达式。换句话说,如果表达式P指向数组对象的第i(P)+N个元素,则表达式(等效地,N+(P))和(P)-N(其中N的值为n)分别指向第i + n个和i-<i>数组对象的第 n 个元素,前提是它们存在。此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向数组对象的最后一个元素,如果表达式Q指向数组对象的最后一个元素,则表达式(Q)-1指向最后一个元素数组对象。如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则计算不应产生溢出;否则,行为未定义。如果结果指向数组对象的最后一个元素,则不应将其用作计算的一元运算符的操作数*

要将其与您对前缀++运算符的使用联系起来,您还需要阅读第 6.5.3.1 节前缀增量和减量运算符,第 2 段:

前缀++运算符的操作数的值递增。结果是递增后操作数的新值。表达式++E等价于(E+=1)

还有第 6.5.16.2 节复合赋值,第 3 段:

op形式的复合赋值与简单赋值表达式 op 的不同之处在于左值只计算一次。E1 = E2E1 = E1 (E2)E1

于 2011-02-15T00:53:55.637 回答
3

它将指针位置增加 的大小,int指针的声明类型。

请记住,anint *只是指向内存中某个位置的指针,您说的是存储“int”的位置。当您++指向指针时,它会将其移动一个位置(按类型的大小),在这种情况下,它将使您的值“4”更高,因为sizeof(int)==4.

于 2011-02-15T00:52:04.263 回答
2

这样做的原因是使以下陈述成立:

*(ptr + n) == ptr[n]

这些可以互换使用。

于 2011-02-15T00:53:49.193 回答
1

在指针算术中,给指针加一将增加它所指向的类型的大小。

所以对于给定的:

TYPE * p;

添加到 p 实际上会增加sizeof(TYPE). 在这种情况下,int 的大小为 4。

请参阅此相关问题

于 2011-02-15T00:51:56.433 回答
1

因为在“C”中,指针算术总是按所指向对象的大小进行缩放。如果您稍微考虑一下,事实证明这是“正确的做法”。

于 2011-02-15T00:52:53.750 回答
1

它这样做是为了让您不会开始访问它中间的整数。

于 2011-02-15T00:52:58.247 回答
0

因为指针不是引用;)。它不是一个值,它只是内存中的一个地址。当您检查指针的值时,它将是一个数字,可能很大,并且与存储在该内存位置的实际值无关。比如说,printf("%p\n", a);打印“2000000”——这意味着你的指针指向你机器内存中的第 2000000 个字节。它几乎不知道它存储在那里的价值。

现在,指针知道它指向什么类型。一个整数,在你的情况下。由于一个整数是 4 个字节长,当你想跳转到指针指向的下一个“单元格”时,它需要是 2000004。那是 1 个整数,所以a++非常有意义。

顺便说一句,如果你想得到42(从你的例子),打印出指向的值:printf("%d\n", *a);

我希望这是有道理的 ;)

于 2011-02-15T00:56:31.970 回答
0

这很简单,因为当它归结为指针时,在你的情况下是整数指针,一元增量意味着将内存位置增加一个单位,其中一个单位 = 整数的大小。

这个整数的大小取决于编译器到编译器,对于 32 位和 16 位,它是 4 字节,而对于 64 位编译器,它是 8 字节。

尝试使用字符数据类型执行相同的程序,它会给出 1 个字节的差异,因为字符需要 1 个字节。

简而言之,您遇到的 4 的差异是内存中一个整数的大小差异。

希望这会有所帮助,如果没有,我很乐意提供帮助,请告诉我。

于 2011-02-15T06:43:19.397 回答
0

“它为什么这样做?” 为什么你会期望它做其他事情?递增一个点使其指向它所指向的类型的下一项。

于 2011-02-15T12:21:15.057 回答