2013-10-27 21 views
-1

我已經執行了一個程序並找到了輸出,但是我對程序的工作並不滿意。代碼查詢C程序的輸出

O/P:

1 1 1 
2 2 2 
3 3 3 
3 4 4 

我把下面的代碼,在代碼中的查詢一起。

#include <stdio.h> 
#include <conio.h> 
int main() 
{ 
    static int a[ ] = {0,1,2,3,4}; 
    int *p[ ] = {a,a+1,a+2,a+3,a+4}; 
    int **ptr = p; 
    ptr++;       
    printf("%d",*ptr); //It displays me the output for the this line as -170 why? 
    printf(「\n %d %d %d」, ptr-p, *ptr-a, **ptr); 
    *ptr++; 
    printf(「\n %d %d %d」, ptr-p, *ptr-a, **ptr); 
    *++ptr; 
    printf(「\n %d %d %d」, ptr-p, *ptr-a, **ptr); 
    ++*ptr; 
    printf(「\n %d %d %d」, ptr-p, *ptr-a, **ptr); 
} 
+2

_「stalk overflow」_很好 – P0W

回答

1

您的打印的a[1]地址在這裏,因爲* PTR指向一個[1]元素 所以

printf("%u",*ptr); // prints the address of a[1] element 
    printf("%u",&a[1]); // check this statement you will get the same values 

要打印值,用另一*printf("%d",**ptr);它打印a[1]值是1 考慮

a[0] -> 0 a[1] -> 1 a[2] -> 2 a[3] -> 3 a[4] - > 4 
    1000  1004  1008  2012  2016 -> Addresses 

    p[0] -> 1000 p[1] -> 1004 p[2] -> 1008 p[3] -> 2012 p[4] -> 2016 
    4000   4004   4008   4012   4016 -> Addresses 

    ptr - > 4000 
    8000 -> Address 

這就是happ在第一個3 stataments.Now ENS

ptr++ ==> ptr = ptr + 4 ; ptr = 4000 + 4 -> ptr = 4004 

so printf("%u %u %u %u",&ptr,ptr,*ptr,**ptr); 

&ptr prints address of ptr 8000 
ptr prints address of p[1] 4000 
*ptr prints value in p[1]  1004 (value in p[1] is address of a[1]) 
**ptr prints value of a[1]  1 
0

你基本上給printf的指針,這可能會導致看似隨機值(它包含了一個內存地址)。如果你想給printf 指出的東西,你必須解除引用它兩次而不是隻有一次(這應該導致預期值)。

+0

它也會給出負值嗎? – Arun

+0

@ V.ARUNNagarajan當我測試它時,它給了我'1'(它提領了'ptr + 1',導致了'a + 1',所以它取消了這個,導致了'1')...這就是你通緝? – MiJyn

+0

@ V.ARUNNagarajan:這裏是鏈接到ideone:http://ideone.com/FTk4g1,你的代碼基本上是打印一些變量的地址。 –

0

INT * P [] - >是指針 的陣列的存儲器結構會像

  p(0x100)------>p[0](0x200) 
         ++ 
         p[1](0x204) 
         ++ 
         p[2](0x208) 

     ptr=p 
     ++ 
     ptr+1 will be (0x104) 

在程序的情況下,從Ptr ++將指向p的下一個地址。這是因爲p是數組,而數組是連續的。當你解除引用時,它會打印下一個p數組的值,它是+ 1