【发布时间】: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 < 10; x++) { *pn = x + 1; pn++; }For 循环不必必须从0开始。相反:for (x = 1; x <= 10; x++) { *pn = x; pn++; }我们可以通过了解后自增运算符的工作原理来进一步清理它:for (x = 1; x <= 10; x++) { *pn++ = x; }