-1

I have executed a program and found the output.But I'm not satisfied about the working of the program.

o/p of the code:

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

I put the following code along with the query in the code.

#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); 
} 
4

3 回答 3

1

您打印a[1]此处的地址是因为 *ptr 指向 a[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

这就是你的前 3 个状态中发生的情况。现在

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 
于 2013-10-27T05:52:39.727 回答
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 数组的下一个值,即 a+1

于 2013-10-27T06:14:58.593 回答
0

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

于 2013-10-27T04:17:51.530 回答