【问题标题】:C language. Can't understand the output of the pointersC语言。无法理解指针的输出
【发布时间】:2020-12-01 17:34:24
【问题描述】:

我有以下代码。

    int a = 10, b = 20;
    int *x, *y, *z;
    int **pp;
    int arr[3] = { 5, 13, 29 };
    x = &b;
    pp = &y;
    y = arr + 1;
    *y = a;
    z = y;
    **pp = 999;
    y++;

    printf("%i %i %i %i %i %i %i %i %i", a, b, *x, *y, *z, **pp, arr[0], arr[1], arr[2]);

我预计输出将是 10 20 20 29 10 999 5 999 29,但是,正确的输出似乎是 10 20 20 29 999 29 5 999 29。区别在于*z**pp。我不明白为什么会这样,即使我尝试绘制图表并逐步分析结果。为什么*z**pp 分别是999 和29,而不是10 和999?谢谢。

【问题讨论】:

  • pp = &y 表示pp 指向指针y。这意味着*py 相同,**pp*y 相同。因此,在使用**pp 的两个语句中,您可以将**pp 更改为*y 并得到相同的结果。

标签: arrays c pointers implicit-conversion pointer-arithmetic


【解决方案1】:

这句话之后

y = arr + 1;

指针y指向数组arr的第二个元素,

所以第二个元素在下一条语句之后设置为10

*y = a;

我们有以下数组arr的内容

{ 5, 10, 29 }

指针 z 也指向第二个元素

 z = y;

但是第二个元素被重写了

 **pp = 999;

因为取消引用的指针pp 总是产生指针y。现在数组的内容是

{ 5, 999, 29 }

并且指针y在此语句之后递增

y++;

指向数组的第三个元素。请注意,指针pp 仍然指向指针y,该指针现在存储了数组第三个元素的地址。

变量ab 没有改变> 所以printf 的调用输出

10 20

指针x指向变量b所以我们有

10 20 20

指针y 指向数组的第三个元素。所以

10 20 20 29

指针z 指向数组的第二个元素,因为它在递增之前具有指针y 的值。

10 20 20 29 999

指针pp 指向指针y,因此表达式**pp 产生与表达式*y 相同的值

10 20 20 29 999 29

这些表达式arr[0], arr[1], arr[2]依次提供数组的值

10 20 20 29 999 29 5 999 29

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多