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 */
输出是一样的。这是为什么?
答案 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("%d %d", *++ptr, *++ptr);
,您无法知道结果,因为代码将依赖于评估顺序,即它包含可能严重的错误。