在c中的数组中减去指针变量?

时间:2014-10-02 17:25:40

标签: c arrays pointers

   #include <stdio.h>
   #include <stdlib.h>

   int main()  
   {   
      int arr[]={10,20,30,40,50,60,70};      
      int *i,*j,*k;     
      k=2686703;     
      i=&arr[1];     
      j=&arr[5];           
      printf("%d\n%d\n",i,j)  ;        
      printf("%d\n",j-i);        
      printf("%d",*(k));  
      return 0;
   }

输出:

 2686700  
 2686716  
 garbage value 

为什么j和i之间的差异= 4而不是16?如果为数组中的每个整数保留4个字节,为什么它们的垃圾值与此中间地址相对应?

1 个答案:

答案 0 :(得分:2)

  

为什么j和i之间的差异是4而不是16,如果为数组中的每个整数保留4个字节

因为这是指针算术的工作方式:它将sizeof(element)除以差异。这简化了使用指针的编程,因为程序员更容易根据数组元素而不是原始字节来考虑偏移。

  

为什么垃圾值与此中间地址相对应

您取消引用指针k,它被赋予一个未与任何整数对齐的值。一般来说,这是未定义的行为。但是,在您的情况下,您选择了一个恰好指向数组中间的值。根据系统的不同,结果可能是任何东西 - 从因未读对齐读取而崩溃到将有效字节重新解释为不同的整数。