【问题标题】:Re-initializing a Pointer To Fill an Array: Why?重新初始化一个指针来填充一个数组:为什么?
【发布时间】:2021-11-29 06:08:16
【问题描述】:

我正在阅读 Dan Gookin 的 C Programming for Dummies,我无法理解练习 19-6 的解决方案,为什么他要重新初始化指针。

这是我应该修改的原始代码。在第 8 行(带有注释),他将指针 pn 初始化为数组 numbers

#include <stdio.h>

int main()
{
    int numbers[10];
    int x;
    int *pn;

    pn = numbers;       /* initialize pointer */

    /* Fill array */
    for(x=0;x<10;x++)
    {
        *pn=x+1;
        pn++;
    }

    /* Display array */
    for(x=0;x<10;x++)
        printf("numbers[%d] = %d\n",
                x,numbers[x]);

    return(0);
}

好的,到目前为止我还不错。

但在下面的练习解决方案中,我遇到了问题,他要求“使用指针变量 pn 的 'peeker' 端使第二个 for 循环显示数组的值”(Peeking 是他的少我真正喜欢的解除引用的技术术语)。

这是他的解决方案:

#include <stdio.h>

int main()
{
    int numbers[10];
    int x;
    int *pn;

    pn = numbers;       /* initialize pointer */

/* Fill array */
    for(x=0;x<10;x++)
    {
        *pn=x+1;
        pn++;
    }

    pn = numbers;

/* Display array */
    for(x=0;x<10;x++)
    {
        printf("numbers[%d] = %d, address %p\n",
                x+1,numbers[x],pn);
        pn++;
    }

    return(0);
}

填充数组后,他将pn 重新初始化为数字。他为什么要这样做? pn 不是已经指向 numbers 数组了吗?因此,当他用pn 指向的地址处的值*pn = x+ 1 填充它时(应该是numbers 对吗??),为什么numbers 数组没有被填充?显然,他需要执行此步骤,因为当我取出这条线时,我原来的解决方案中缺少这条线,它不起作用。

如果不看,我永远不会独自想到这个解决方案,所以现在我想了解为什么要进行这个重新初始化步骤。

【问题讨论】:

  • 请注意,不需要这种模式:for (x = 0; x &lt; 10; x++) { *pn = x + 1; pn++; } For 循环不必必须0 开始。相反:for (x = 1; x &lt;= 10; x++) { *pn = x; pn++; } 我们可以通过了解后自增运算符的工作原理来进一步清理它:for (x = 1; x &lt;= 10; x++) { *pn++ = x; }

标签: arrays c pointers


【解决方案1】:

pn++; 递增 pn。包含这个的循环执行后,pn 不再指向numbers 的开头;一直递增到最后。

【讨论】:

  • 噢,我明白了!谢谢你。我听说增加这样的指针pn++ 实际上是不可取的,因为它很容易触及你不应该触及的内存。您对此有何看法?
  • @ai88 你可以随时pn[x]
  • @0___________:有趣。我以前从未见过这种符号。当然,我是 C 的新手(我是在 7 月下旬才开始学习哈佛的 CS 简介)。但这只是指针变量上的数组表示法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2020-03-20
  • 2018-01-09
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多