C++数组和指针

C++数组和指针,c++,c,C++,C,有人能帮我解决以下数组不等式吗: #include <stdio.h> #define PRD(a) printf("%d", (a)) #define NL printf("\n") int a[] = {0,1,2,3,4}; int main () { int i; int*p; for (i=0; i<=4; i++) PRD(a[i]); NL; for (p=&a[0]; p<=&a[4]; p++)

有人能帮我解决以下数组不等式吗:

#include <stdio.h>
#define PRD(a) printf("%d", (a))
#define NL printf("\n")

int a[] = {0,1,2,3,4};

int main ()
{
  int i;
  int*p;

  for (i=0; i<=4; i++)
    PRD(a[i]);
  NL;

  for (p=&a[0]; p<=&a[4]; p++)
    PRD(*p);
  NL;

  for (p=&a[0]; i=0; p+i<=a+4; i++)
    PRD(p[i]);
  NL;

  for (p=a, i=0; p+i<=a+4; p++, i++)
    PRD(*(p+i));
  NL;

基本上我不理解这4个循环,请帮我解释一下

这里的一个细节是,你要问的不等式是指针,而不是数组。考虑比较内存位置,以下内容将更容易理解

第一个应该非常简单:按[0]和[1]的顺序打印数组的每个元素。 在数字2中,p是a的元素0的地址。p++将该地址增加为数组中下一个元素的地址。当p小于或等于数组中第4个元素的地址时,可以读取终止条件。把一些值具体化:想象一下&a[0]是200,结果&a[4]是216,随着p的增加,它变成204、208、212、216,最后变成220。 当它变为220时,条件变为false,循环结束。 数字3的左边是相似的,但它没有增加p,而是增加了i到p。注意,由于指针算术的魔力,p+1实际上是p+i*sizeof*p。顺序与案例2中的顺序完全相同。顺便说一句,初始化应该是p=&a[0],i=0;注意i前面的逗号。对于右边的a+4,普通的a表示a的第一个元素的地址,这是指针和数组之间的C等价性,这是一个充满微妙和痛苦的主题。因此,a+4相当于&a[4]。 第四个就是要搞乱你的脑袋。上述信息应足以转换初始化和条件;但是同时拥有i++和p++意味着每次迭代将推进2个元素。
这里使用的预处理器可能会模糊调用的内容,请尝试手动扩展以更轻松地进行后续操作。PRD应该在每个数字之后增加一个空间,以便更容易阅读。

难怪,我在C++中编程了15年,我也不理解它们。因此,你应该能够通过阅读任何一个体面的C++编程书的前几章来很好地掌握它们。它们实际上是指针和数组,但是我不明白for循环中的条件,有人能告诉我吗?@H2CO3你是说一本像样的C语言书。一本不错的C++书籍将把原始指针和数组的讨论推向结尾。@ H2CO3在内核中写关键的严格循环是很好的,但这不是通常要开始的。