考虑以下陈述:
int *pFarr, *pVarr;
int farr[3] = {11,22,33};
int varr[3] = {7,8,9};
pFarr = &(farr[0]);
pVarr = varr;
在这个阶段,两个指针都指向各自数组地址的开始。对于 *pFarr,我们目前正在查看 11,对于 *pVarr,我们正在查看 7。
同样,如果我通过 *farr 和 *varr 请求每个数组的内容,我也会得到 11 和 7。
到现在为止还挺好。
现在,让我们尝试pFarr++
和pVarr++
。伟大的。正如预期的那样,我们现在正在查看 22 和 8。
但现在...
试图向上移动farr++
并且varr++
......我们得到“错误类型的参数来增加”。
现在,我认识到数组指针和常规指针之间的区别,但由于它们的行为相似,为什么会有这种限制?
当我还考虑到在同一个程序中我可以以表面上正确的方式和另一种不正确的方式调用以下函数时,这让我更加困惑,并且我得到了相同的行为,尽管与上面发布的代码中发生的情况相反!?
working_on_pointers ( pFarr, farr ); // calling with expected parameters
working_on_pointers ( farr, pFarr ); // calling with inverted parameters
.
void working_on_pointers ( int *pExpect, int aExpect[] ) {
printf("%i", *pExpect); // displays the contents of pExpect ok
printf("%i", *aExpect); // displays the contents of aExpect ok
pExpect++; // no warnings or errors
aExpect++; // no warnings or errors
printf("%i", *pExpect); // displays the next element or an overflow element (with no errors)
printf("%i", *aExpect); // displays the next element or an overflow element (with no errors)
}
有人可以帮助我理解为什么数组指针和指针在某些情况下的行为方式相似,但在其他情况下却不同吗?
非常感谢。
编辑:像我这样的菜鸟可以从这个资源中进一步受益:http: //www.panix.com/~elflord/cpp/gotchas/index.shtml