我对C中的这个简单程序有疑问,需要用指针和数组进行练习。
代码:
#include <stdio.h>
fun(int *p, int *v) {
*p++;
*(v+2) = p[3];
*v++ = p[0];
v[0] = *(p+4);
}
int main() {
int v[] = {90, 89, 8, 78, 60, 120};
int k[] = {0, 0, 0, 0, 0, 0};
int *ptr = k;
fun(v, ptr);
for (ptr = k; ptr < k + 6; ptr++)
printf("%d\n", *ptr);
}
所以我的问题是它打印89 120 60 0 0 0
。
答案 0 :(得分:2)
绘制(甚至手工纸上!)指针和数组发生了什么是有用的。对于以下功能:
void fun(int *p, int *v) {
*p++;
*(v+2) = p[3];
*v++ = p[0];
v[0] = *(p+4);
}
您已通过这些数组:
[90] [89] [8] [78] [60] [120]
|
p
[0] [0] [0] [0] [0] [0]
|
v
fun
会发生什么?
*p++
这可以通过以下两种方式之一来读取:取消引用p和(post)递增该值,或者后递增p并取消引用p的旧值。这是什么?我们方便的operator precedence表说++之前是*,所以它是第二个。请注意,我们遵循指针,但不执行任何操作。这意味着我们可以编写p++
并获得相同的结果。
增量后,我们的指针发生了变化:
[90] [89] [8] [78] [60] [120]
|
p
下一行同时使用p
和v
:
*(v+2) = p[3];
您可以将其读作“将p右侧的第3个值指定给v右侧的第2个点”。 p右边的第三个点有60
,它就在这里:
[0] [0] [60] [0] [0] [0]
|
v
接下来:
*v++ = p[0];
从以前开始,我们知道* v ++意味着(后)增量v. ++ v(预增量)和v ++(后增量)之间的区别是返回的值 - 在这种情况下,我们将修改v但使用其旧值,指定p指向的内容。请注意,v已递增:
[89] [0] [60] [0] [0] [0]
|
v
最后:
v[0] = *(p+4);
这可以理解为“将p右侧的第4个值分配给v右侧的第0个点”。 p右边的第四个点有120个,它就在这里:
[89] [120] [60] [0] [0] [0]
|
v
所以在函数结束时,这就是我们的指针和内存的样子:
[90] [89] [8] [78] [60] [120]
| |
| p
main-v
[89] [120] [60] [0] [0] [0]
| |
| v
main-k
main-ptr