有关C中指针和数组的问题

时间:2013-06-14 17:12:32

标签: c arrays pointers

我对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

的原因

1 个答案:

答案 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

下一行同时使用pv

    *(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