c中的输出有问题

时间:2013-08-11 10:25:23

标签: c output

可以假设

ptr具有地址1000:2000

int ptr[2];
printf("%p %p %p",&ptr+1,ptr+1,ptr);

上述代码的输出是什么?

我尝试了什么:
由于我不知道如何解释/转换1000:2000到一个地址,我尝试手动。

我通过将ptr的地址视为10000+2000=12000来尝试此操作 所以,&ptr=12000&ptr+1=12000+sizeof(int)
ptr是指向的第一个元素的地址,类似地ptr+1是第二个元素的地址
这是对的吗? 我该怎么测试呢?

2 个答案:

答案 0 :(得分:1)

如果您知道类型,这是简单的指针算术。

int ptr[2];
printf("%p %p %p",&ptr+1,ptr+1,ptr);

ptr是数组的名称,它衰减到指向第一个元素的指针。如果它是一本旧书,那就是1000:2000

因此ptr+1是一个元素,因此,如果int的大小为4,1000:2004。 (本书中可能int的大小为2,因此它为1000:2002。)

但是,

&ptr是指向数组的指针。它指向同一个地方 - 1000:2000 - ,但指向更大的项目:两倍大。所以加1,结果增加了两个整数的大小,因此8 resp 4.所以&ptr+1得到1000:2008 resp。 1000:2004作为答案。

答案 1 :(得分:1)

+-------------------------------------+
|{ ptr[0]  ptr[1] } {ptr1[0],ptr1[1]} |
|   ^      ^           ^              |
|   |      |           |              |
|  ptr   ptr+1         |              |
|   |                  |              |
|  &ptr              &ptr+1           |
+-------------------------------------+

很容易理解ptr指针指向此数组的第一个地址项,ptr+1指针指向第二个数组项。 &ptr,它是int array[2] int是int (*x)[2]的指针点,因此& ptr +1表示地址移动int array[2]

这是一个测试代码:

  #include <stdio.h> 
  int main()
  {
      int ptr[2];
      int  i;
      for (i =0; i <3; ++i)
          printf("ptr + %d is :   %p\n",i,&(ptr[i])); 
      printf("\n&ptr +1 :    %p\nptr+1  :    %p\nptr  :    %p\n",&ptr+1,ptr+1,ptr);
  }

屏幕打印

ptr + 0 is :    0xbf892614         <---the same as ptr        base address   
ptr + 1 is :    0xbf892618         <---the same as prt+1      4 byte add
ptr + 2 is :    0xbf89261c         < --the same as &ptr +1    4 byte add

&prt +1    :    0xbf89261c      
ptr+1      :    0xbf892618     
ptr        :    0xbf892614