带指针的 C 输出

C Output With Pointers

我试图理解以下代码段的输出,它是如何产生输出的

-2 1 2 -4 3

int main()
{
    int i, a[5] = {3, 1, 2, -2, -4};
    int *p = a;

    for(i = 0; i < 5; i++)
    {
        printf("%d ", *(p + *p));
        p += *p;
    }

    return 0;
}

本程序以指针运算为主

  • p是指针。
  • *p是指针处的值
  • *(p + *p) 实际上是 p[*p]
  • p += *p;p = p + *p

现在,根据特定值,在本例中,对于第一次迭代,

printf("%d ", *(p + *p));

printf("%d ", *(p + 3));

或 printf("%d", p[3]);

给出-2。

接下来p += *p就是p += 3等等

您可以阅读更多关于指针运算的内容here

*(p + *p) = *(p + 3) = p[3] = -2 /* p = a and *p will give the value of first element of the array */

p = p + *p = p + 3

*(p + *p) = *((p+3) + *(p+3)) = *((p+3) + p[3]) = *(p + 3 -2) = p[1] = 1

等等

PS: a[i] = *(a+i)

考虑这个条件... n 一些字节地址

 Elements:       3  1    2   -2      4
 with addresses:  n  n+1  n+2  n+3  n+4 (this is in bytes)

现在我们最初有 *p=a 也就是 p 指向数组 a 的第一个元素。因此,我们将有 *p=3p=n(即 p 的第一个元素的地址为 n)。

在第一个循环中我们有.. printf("%d ", *(p + *p));.....

因此,*(p + *p) 表示地址 (p+*p) 处的元素,其中我们有 p=n*p=3。所以 *(p + *p)n+3 处的元素,即 -2.

不,我们有 p += *p;。这意味着 p=p+ *p 。所以 p = n + 3 ==> p 现在指向 -2 ..

这是循环的方式..

Loop 1:
   *p = 3
    p = n
    *(p + *p ) ==> *(n+3) = -2
    p = p + *p ==>  p = n+3
Loop 2:
    *p = -2
     p = n+3
    *(p + *p ) ==> *(n+3 -2) = 1
     p =p + *p ==> p = n+3 -2 ==> n+1 
Loop 3:
    *p = 1
     p= n+1
    *(p + *p ) ==> *(n+1 +1) = 2
     p =p + *p ==> p = n+1 +1 ==> n+2
Loop 4:
    *p = 2
     p= n+2
    *(p + *p ) ==> *(n+2 +2) = -4
     p =p + *p ==> p = n+2 +2 ==> n+4
Loop 5:
    *p = -4
     p= n+4
    *(p + *p ) ==> *(n+4 -4) = 3
     p =p + *p ==> p = n+4 -4 ==> n
a[0]   a[1]  a[2]  a[3]  a[4]   // array indexes
 3       1     2    -2    -4    // value
1001   1005   1009  1013  1017  // Consider it is memory location.

p == 1001; // p=a;

递增会像这样完成。 p+ (value * sizeof(int) )

在第一个循环中,

1001 + 3 ; // *(p + *p); p== 1001 , *p == 3

因此它将打印 1013 中等于 -2 的值。

After that you are doing this `p += *p;` Now `p` points to `1013`

第二个循环,

1013 + -2; // *(p + *p); p== 1013 , *p == -2

所以它会打印1 (1005 )。分配 之后,现在 p 指向 1005.

第三个循环,

1005 + 1 ; // *(p + *p ); p == 1005  , *p == 1

它将打印 2(1009)。现在 p 变为 1009.

第四个循环,

1009 + 2 ;  // *(p + *p ); p == 1003 , *p == 2

它会打印-4(1017)并且p变成1017.

最后,

1017 + -4 ; // It becomes 1001.

因此它将打印 1001 中的值。因此值为 3。

value  3   1    2   -2   -4
addr 100  104  108  112  116  (say)

First iteration:
------------------------------------------------------------------
int *p = a; --> p = 100 (base address of the array )
( *(p + *p) ) --> (*(100+4(size of int)X *(100) ) --> (*(100+4X3)) -->(*(112))= -2

 p += *p; -->(p= (p+*p))-->(100 +*(100)X4) --> (100 +3X4) --> (112)
Now p=112 (memory address).

Second iteration:
----------------------------------------------------------------------
( *(p + *p) )-->(*(112+*(112)X4)-->*(112 (-2X4))-->*(112-8)=*(104)=1
p += *p; -->(p= (p+*p))-->((112 + *(112)X4)-->(112 +(-2X4))= 104
now p=104 (memory address)


like this ......