指针输出C语言

3

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

-2 1 2 -4 3


该代码的输出为一个整数序列,其中每个整数代表输入序列中每个元素的绝对值,即 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;
}

1
这可能会有所帮助:指针算术 - Anto Jurković
5个回答

3
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。


2

这个程序主要基于指针算术。

  • 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,以此类推。

你可以在这里了解更多指针算术知识。


1
*(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)


1
考虑以下情况...在某个字节地址中。
 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

1
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 ......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接