-1

任何人都可以帮助我解决数组的以下不等式:

#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个循环,请帮我解释一下!

4

1 回答 1

2

这里有一个细节,您要询问的“不等式”是关于指针,而不是数组。想想比较内存位置,下面会更容易理解。

  • 第一个应该非常简单:按顺序打印数组的每个元素(a[0],a[1]等)
  • 在数字 2 中,p是 的元素的0地址ap++将该地址增加到数组中下一个元素的地址。终止条件可以读作“p小于或等于数组中第 4 号元素的地址”。设置一些值并使其具体化:想象&a[0]200,结果&a[4]216,随着p增加它变成204, 208, 212, 216,最后是220。当它变为220条件时变为假,循环结束。
  • 数字 3 的左侧类似,但不是增加而是p增加。请注意,由于指针算术的魔力实际上是. 顺序与案例 2 完全相同。顺便说一句,初始化应该是, (注意 之前的逗号)。对于右边,简单的 a 表示 a 的第一个元素的地址(这是指针和数组之间的 C 等价,充满微妙和痛苦的话题)。因此等价于。ipp + 1p + i*(sizeof(*p))p = &a[0]i=0;i(a+4)aa + 4&a[4]
  • 数字 4 会弄乱你的脑袋。以上信息应该足以翻译初始化和条件;但同时拥有i++p++意味着每次迭代都会推进 2 个元素。

此处使用预处理器可能会掩盖所调用的内容,请尝试手动扩展以更轻松地跟进。PRD 应该在每个数字后添加一个空格,以便于阅读。

于 2013-09-04T06:16:05.293 回答