-4

代码是:

#include<stdio.h>
main()
{
   char arr[]={'a','b','c','d'};
   char *i,*j,*k;
   i=&arr[1];
   j=&arr[2];
   k=&arr[3];
   printf("%s %p %p %p %s\n",(j-i)'i,j,k,(k-i));
}
  1. 当我尝试编译此错误时,显示的错误是 %s 期望 (char *) 但它是 (即 (ji)) 是 int。但我认为我将 j&i 定义为 char 指针,那么 (ji) 如何成为整数。

  2. 如果我使用 %d 而不是 %s,则 (ji) 的答案为 1,而 (ki) 的答案为 2,这实际上是元素差异。这是如何发生的。

  3. 当我使用 %p 打印上面的 i,j,k 的地址时,它会执行正确的地址,但是为什么不能减去 2 个地址以给出它们的字节差异呢?

请给出你的观点?

编辑:为关于指针差异的问题的第二部分添加代码:

#include<stdio.h> 

main() 
{ 
    int arr[]={10,20,34,65}; 
    int *i,*j,*k; 
    i=&arr[1]; 
    j=&arr[2]; 
    k=&arr[3]; 
    printf("%d %p %p %p %d\n",(j-i),i,j,k,(k-i)); 
}
4

1 回答 1

1

由于没有人费心写实际答案:

  1. 从另一个中减去指针会给出指针的差异,如整数。

  2. 指针值的差异在于指向类型的大小(当您想到做什么时,这一点很明显intptr++)。

  3. 要获得字节差异,请乘以类型的大小,例如(sizeof int)*(j-i)

于 2013-02-23T16:49:36.097 回答