#include <stdio.h>
int main(void)
{
int i;
int *ptr = (int *) malloc(5 * sizeof(int));
for (i=0; i<5; i++)
*(ptr + i) = i;
printf("%d ", *ptr++);//prin1
printf("%d ", (*ptr)++);//print2
printf("%d ", *ptr);//print3
printf("%d ", *++ptr);//print4
printf("%d ", ++*ptr);//print5
}
我正在
0 1 2 2 3
作为输出。
我无法理解为什么“print4”正在打印2它应该打印3作为指针* ++ ptr将被视为*(++ ptr),即指针将首先递增
答案 0 :(得分:5)
*ptr++
- &gt;打印0
,按ptr
增加1
(*ptr)++
- &gt;打印1
,将1
增加到2
*ptr
- &gt;打印存储的增量值,即2
*++ptr
- &gt;按ptr
增加1
,然后打印ptr
指向的值2
。
++*ptr
- &gt;增加值2
,由ptr
指出,然后打印,即3
。
答案 1 :(得分:3)
在C中,最好不要投射malloc()
的结果。这样做可以隐藏编译器可能会发出警告的错误,最坏情况下的错误可能会导致程序崩溃。
int *ptr = malloc(5 * sizeof(int));
ptr
现在指向5 int
的内存,并在循环中使用连续值初始化它们。在循环结束时,情况可以这样显示:
+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
^
ptr
现在,我们可以绘制一张图片以对应每行代码。
printf("%d ", *ptr++);//prin1 +---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
^
ptr
由于使用了后期增量,因此会打印0
,并且ptr
会递增。
printf("%d ", (*ptr)++);//print2 +---+---+---+---+---+
| 0 | 2 | 2 | 3 | 4 |
+---+---+---+---+---+
^
ptr
打印取消引用的值1
,然后后递增,因此它变为2
。 ptr
没有移动。
printf("%d ", *ptr);//print3 +---+---+---+---+---+
| 0 | 2 | 2 | 3 | 4 |
+---+---+---+---+---+
^
ptr
现在,打印出取消引用的值2
,并且没有任何更改。
printf("%d ", *++ptr);//print4 +---+---+---+---+---+
| 0 | 2 | 2 | 3 | 4 |
+---+---+---+---+---+
^
ptr
ptr
上的预增量将其移至下一个元素,并打印解除引用的值2
。
printf("%d ", ++*ptr);//print5 +---+---+---+---+---+
| 0 | 2 | 3 | 3 | 4 |
+---+---+---+---+---+
^
ptr
取消引用的值2
已预先递增,因此会打印值3
。
答案 2 :(得分:0)
那是因为你在print3上没有增加。
答案 3 :(得分:0)
您可能无法理解ptr在流程中指向的位置......下面的额外注释是否会将其清除?
printf("%d ", *ptr++); // ptr now point to ptr[1] which is initialized to 1
printf("%d ", (*ptr)++);// update ptr[1] to 1+1 = 2
printf("%d ", *ptr); // printing the value pf ptr[1]
printf("%d ", *++ptr); // incrementing ptr, to pointing to ptr[2] which
// is initialized to 2....
printf("%d ", ++*ptr); // incrementing the value of ptr[2] to (2+1) = 3