【3】指针的加减
1、指针+数字:
//指针+数字:指针加法需要调整,调整的权重为指针本身去掉一个*号,求sizeof
//举例:int *p;p+2的值为p的值加上2*sizeof(int)个字节
指针+数字: 需要调整,调整的权重为sizeof(指针只去掉一个*)
首先,应该知道各个类型所占的字节:
char 1 short 2 int 4 long 4 long long 8 float 4 double 8
之后计算各个需要打印的值:
(1)p+2:去掉一个*,属于int型,sizeof()是4,则p+2为2*4+1000=1008
(2)(char ***)p+2:去掉一个*,此时的数据类型为char**,属于二维指针变量,sizeof()是4,则p+2为2*4+1000=1008
(3)(short *)p+2:去掉一个*,此时数据类型为short,sizeof()为2,则此时的p+2为2*2+1000=1004
(4)(double**)p+2:去掉一个*,此时的数据类型为double*,属于一维指针变量,sizeof()为4,则此时的p+2为2*4+1000=1008
(5)(unsigned long *)p+2:去掉一个*,此时的数据类型为unsigned long,sizeof()为4,则此时的p+2为2*4+1000=1008
(6)(char *)p+2:去掉一个*,此时的数据类型为char,sizeof()为1,则此时的p+2为2*1+1000=1002
(7)(unsigned long long )p+2:由于它将p强制转化为unsigned long long,但它不是一个指针变量,因此直接将p加上2得到1002
2、指针-数字:
//指针 -数字:需要调整,调整的权重为sizeof(指针去掉一个*)
题目中的2010是十六进制,转换成十进制为2016(只转换了后两位)
(1)p-2:去掉一个*,属于int型,sizeof(int)是4,则2016-4*2=2008;
(2)(float *)p-2:去掉一个*,属于float型,sizeof(float)是4,则2016-4*2=2008;
(3)(double *)p-2:去掉一个*,属于double型,sizeof(double)是8,则2016-8*2=2000;
(4)(short*)p-2:去掉一个*,属于short型,sizeof(short)是2,则2016-2*2=2012,后面两位转换为原来的十六进制为200c;
(5) (unsigned long *)p-2:去掉一个*,属于unsigned long型,sizeof(unsigned long)是4,则2016-4*2=2008;
(6)(long *)p-2:去掉一个*,属于long型,sizeof(long)是4,则2016-4*2=2008;
(7)(long long)p-2:由于它将p强制转化为 long long,它不是一个指针变量,因此直接将p减2得到2014,后面两位转换为原来的十六进制为200e;
(8)(char *)p-2:去掉一个*,属于char型。sizeof(char)是1,则2016-1*2=2014,后面两位转换为原来的十六进制为200e;
3、指针+指针:非法
4、指针-指针:间隔的单元个数,需要调整,调整的权重位sizeof(指针去掉一个*)
指针-指针的计算:1、计算间隔的字节数,2、除以权重
(1)p-q:这两者间隔的字节数为-24,除以权重sizeof(int),即-24/4=-6;
(2)q-p:这两者间隔的字节数为24,除以权重sizeof(int),即24/4=6;
(3)(short*)q-(short*)p:这两者间隔的字节数为24,去掉一个*,属于short型,sizeof(short)为2,除以权重sizeof(short),即24/2=12;
(4)(long long*)q-(long long*)p:这两者间隔的字节数为24,去掉一个*,属于long long型,sizeof(long long)为8,除以权重sizeof(long long),即24/8=3;
(5)(double*)q-(double*)p:这两者间隔的字节数为24,去掉一个*,属于double型,sizeof(double)为2,除以权重sizeof(double),即24/8=3;
(6)(unsigned long)q-(unsigned long )p:这两者间隔的字节数为24,由于它将p、q强转为unsigned long,它并不是一个指针变量,所以q直接减p,即他们间隔的字节数为24;
(7)(char**)q-(char**)p:这两者间隔的字节数为24,去掉一个*,属于char*型,sizeof(char*)为4,除以权重sizeof(char*),即24/4=6;