为什么不*(ptr ++)给出数组中的下一个项目?

时间:2011-02-09 04:58:17

标签: c arrays pointers

int my_array[] = {1,23,17,4,-5,100};
int *ptr;
int i;
ptr = &my_array[0];     /* point our pointer to the first
                         element of the array */
printf("\n\nptr = %d\n\n", *ptr);
for (i = 0; i < 6; i++)
{
    printf("my_array[%d] = %d   ",i,my_array[i]);   /*<-- A */
    printf("my_array[%d] = %d\n",i, *(ptr++));        /*<-- B */
}

为什么这对a和b行显示相同的东西?它只是按顺序显示my_array中的所有值(1,23,17,4,-5,100)。为什么B行中的'++'在取消引用之前没有将ptr指向数组的下一个元素?即使您将该行更改为

printf("ptr + %d = %d\n",i, *ptr++);        /*<-- B */

输出是一样的。这是为什么?

6 个答案:

答案 0 :(得分:13)

ptr ++递增ptr但返回原始值
++ ptr递增并返回新值

因此关于c ++的笑话 - 它比c更多但是你使用原始值= c

答案 1 :(得分:2)

似乎你对括号不会改变你期望的返回值这一事实感到困惑。

如果你用英语认为它可能会更清楚:

p ++表示取p的值,递增p的值,返回p的初始值

因此,*p++会取消引用p的原始值。

考虑到(x)的值与x相同,(p++)的值与p++相同。

因此,*(p++)将取消引用p,与*p++完全相同。

答案 2 :(得分:1)

在C中,增加p ++和预先递增++ p

之间存在差异

p ++:使用p的当前值然后更新它 ++ P:更新p的值然后使用它

因此你的代码应该使用++ ptr

答案 3 :(得分:1)

从命名后增量和预增量可以看出。意思是,变量在操作之后或操作之前递增。

后增量运算符创建一个临时变量来存储当前值并递增变量(但返回带有当前值的临时变量)。在预增量运算符中,没有临时变量。相同的变量递增并返回。

因此在同一语句中使用post-increment运算符意味着使用变量的当前值并在此语句之后递增。而后增量运算符意味着递增变量并在当前语句中使用它。

答案 4 :(得分:0)

有两种类型的运算符:Postfix和Prefix。 * ptr ++是postfix运算符意味着先使用然后再增加 而++ ptr表示前缀运算符意味着先增加然后再使用。

如果您添加另一个printf并在现有代码中打印just * ptr的值,您会发现事情的不同之处。

答案 5 :(得分:0)

要避免这个问题,请写下以下任何一种方法:

++ptr;
printf("my_array[%d] = %d\n",i, *ptr);

printf("my_array[%d] = %d\n",i, *ptr);
++ptr;

这将产生相同的指令数,但具有以下主要优点:

  • 现在更具可读性和易懂性。
  • 如果在printf()语句中多次使用ptr,则无需担心函数参数或操作数的评估顺序,这些参数在C语言中未指定(少数例外)。如果您编写printf("%d %d", *++ptr, *++ptr);,您无法知道结果,因为代码将依赖于评估顺序,即它包含可能严重的错误。