0

ptr可以假设有地址1000:2000

代码:

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

上面代码的输出是什么?

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

ptr我通过将' 的地址视为10000+2000=12000
So来尝试这个,&ptr=12000并且&ptr+1=12000+sizeof(int)
ptr是第一个元素的地址被指向,同样ptr+1是第二个元素的地址
是这样吗?
我该如何测试呢?

4

2 回答 2

1

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

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

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

还有一个元素也是如此ptr+1,因此,如果int大小为 4 1000:2004,. int(本书中可能有 2 号,所以应该是 2 号1000:2002。)

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

于 2013-08-11T10:38:51.360 回答
1
+-------------------------------------+
|{ ptr[0]  ptr[1] } {ptr1[0],ptr1[1]} |
|   ^      ^           ^              |
|   |      |           |              |
|  ptr   ptr+1         |              |
|   |                  |              |
|  &ptr              &ptr+1           |
+-------------------------------------+

很容易理解ptr,指针是这个数组的第一项地址,ptr+1指针是数组的第二项。&ptr,它是一个指针指向a int array[2] int 是a int (*x)[2],所以&ptr +1 表示地址移动a 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  
于 2013-08-11T10:43:03.810 回答