查询C程序的输出

时间:2013-10-27 04:07:03

标签: 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); 
} 

3 个答案:

答案 0 :(得分: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 <强>考虑

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 

这就是你的前3个stataments中发生的事情。现在

{{1}}

答案 1 :(得分:0)

你基本上给了printf一个指针,这可能会导致看似随机的值(它包含一个内存地址)。如果你想给printf提供指向的东西的,你必须取消引用它两次而不是一次(这应该会产生预期值)。

答案 2 :(得分:0)

int * p [] - &gt;是一个指针数组 内存结构就像

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

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

如果是你的程序,ptr ++将指向p的下一个地址。这是因为p是这里的数组,并且数组是连续的。当你取消引用它时,它将打印p数组的下一个值,即+ 1