带指针的 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=3
和 p=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 ......
我试图理解以下代码段的输出,它是如何产生输出的
-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=3
和 p=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 ......