一个简单的关于指针运算和地址运算的有关问题

一个简单的关于指针运算和地址运算的问题
#include <stdio.h>
#include <stdlib.h>
main()
{
  char c,*cp1=&c,*cp2;
  int i,*ip1=&i,*ip2;
  double d,*dp1=&d,*dp2;
  cp2=cp1+1;
  ip2=ip1+1;
  dp2=dp1+1;
  printf("%d,%d,%d\n",cp2-cp1,ip2-ip1,dp2-dp1);
  printf("%d,%d,%d\n",(int)cp2-(int)cp1,(int)ip2-(int)ip1,(int)dp2-(int)dp1);
}
我用code::blocks编译器编译的,结果是:
1,1,1
1,4,8
为什么结果不是:
1,1,1,
1,2,8呢?
还有为什么(int)cp2-(int)cp1表示的是地址的运算呢?

期望各位大侠指点小弟一下!小弟新手!

------解决方案--------------------
探讨
#include <stdio.h>
#include <stdlib.h>
main()
{
char c,*cp1=&c,*cp2;
int i,*ip1=&i,*ip2;
double d,*dp1=&d,*dp2;
cp2=cp1+1;
ip2=ip1+1;
dp2=dp1+1;
printf("%d,%d,%d\n",cp2-cp1,ip2-ip1,dp2-dp1);
printf("%d,%d,%d\n",(int)cp2-(int)cp1,(int)ip2-(int)ip1,(int)dp2-(int)dp1);
}
我用code::blocks编译器编译的,结果是:
1,1,1
1,4,8
为什么结果不是:
1,1,1,
1,2,8呢?
还有为什么(int)cp2-(int)cp1表示的是地址的运算呢?

期望各位大侠指点小弟一下!小弟新手!