(1)指针+-数字
指针+1:意为加一个单元格
指针加减数字,需要调整,调整的权重为sizeof(指针去掉一个*)
int main()
{
int *p1 = (int *)2000;
printf("%d\n",p1+4); //2016
int arr[10] = {1,2,3};
int *p = arr; //int
*p = 10;
p++; //加一个int单元格,4字节
*p = 20;
double brr[5] = {12.3,34.5,56.7};
double *dp = brr; //double
dp++; //加一个单元格,8字节
*dp = 100;
char crr[5] = "abc";
char *cp = crr; //char *cp = "abcde"; //char
cp++; //加一个单元格,1字节
*cp = 'x';
return 0;}
练习:
加法:
int main()
{
int *p = (int *)2000;
printf("%d\n",p+4); //2000+4*4=2016
printf("%d\n",(short *)p+4); //2000+4*2=2008
printf("%d\n",(double *)p+4); //2000+4*8=2032
printf("%d\n",(float **)p+4); //去掉一个*为指针,在32为平台运行,2000+4*4=2016
printf("%d\n",(unsigned short *)p+4); //2000+4*2=2008
printf("%d\n",(long *)p+4); //2000+4*4=2016
printf("%d\n",(char *)p+4); //2000+4*1=2004
printf("%d\n",(unsigned long long)p+4); //2000+4=2004,注意此处已经不是指针类型
return 0;
}
减法算法和加法同理:
//注意,16进制借1当16
int main()
{
int *p = (int *)0x2010;
printf("%x\n",p-2); //2008
printf("%x\n",(short *)p-2); //200c
printf("%x\n",(unsigned long *)p-2); //2008
printf("%x\n",(long long **)p-2); //2008
printf("%x\n",(float *)p-2); //2008
printf("%x\n",(double *)p-2); //2000
printf("%x\n",(char *)p-2); //200e
printf("%x\n",(unsigned long )p-2); //200e,注意此处类型不是指针
return 0;}
(2)指针-指针
间隔的单元格数,不是字节数
计算方法:1、算出字节数;2、除以调整的权重
结果有正负,正负只是表示它们的地址大小
int main()
{
int arr[10] = {1};
int *p = &arr[1]; //x+4
int *q = &arr[9]; //x+36
printf("%d\n",p-q); //-8
printf("%d\n",q-p); //8
printf("%d\n",(short *)q-(short *)p); //16
printf("%d\n",(double *)q-(double *)p); //4
printf("%d\n",(int ***)q-(int ***)p); //8
printf("%d\n",(char **)q-(char **)p); //8
printf("%d\n",(long)q-(long)p); //32,注意此处已不再是指针类型
return 0;}
总结:指针的所有算术运算都需要调整,调整的权重为sizeof(指针去掉一个*)
(3)‘[ ]’自带解引用
int *p;
p=arr;
int arr[10]={1,2,3};
p[i]==*(p+i);
int *p=arr;
*(arr+i)==arr[i];