在进行指针相减或指针加数字时需要进行一些调整。
指针变量(指针)中存放的是地址。
指针 + 数字:指针加法需要调整,调整的权重为指针本身去掉一个*号,求sizeof。如下图.1
指针 - 数字:指针加法需要调整,调整的权重为指针本身去掉一个*号,求sizeof。如下图.1
举例:int *p;p+2的值为p的值加上2*sizeof(int)个字节。
#include<stdio.h>
int main()
{
int *p = (int *)1000;
//把地址强转为int型的指针,值为1000
printf("%d\n",p+2);
//结果为:p = p +2*sizeof(int) = 1008;
printf("%d\n",(char ***)p+2);
//结果为:p = p+2*sizeof(char **) = 1008 因为char **是一个指针类型,所有的指针类型的权重都为四个字节
printf("%d\n",(short *)p+2);
//结果为:p =p + 2*sizeof(short) = 1004;
printf("%d\n",(short *)p-2);
//结果为:p = p - 2*sizeof(short) = 996;
printf("%d\n",(double **)p+4);
//结果为:p = p + 4*sizeof(double *) = 1016;
printf("%d\n",(double **)p-2);
//结果为:p = p - 2*sizeof(double) = 992;
printf("%d\n",(unsigned long *)p+2);
//结果为:p = p + 2*sizeof(unsigned long) = 1008;
printf("%d\n",(char *)p+2);
//结果为:p = p + 2*sizeof(char) = 1002;
printf("%d\n",(unsigned long long)p+2);
//单纯的加2,p = p +2 = 1002;
return 0;
}
图 .1
指针 + 指针:是非法的,一个指针加上一个指针不能表示为两个指针变量中的地址相加
指针 - 指针:是合法的,得出的结果是间隔的单元个数。如下图.2
在指针减指针中,需要对指针进行调整,调整的权重为sizeof(指针去掉一个 *),
计算方法为:1.计算间隔的字节数 2.字节数除以指针的权重
#include<stdio.h>
int main()
{
int arr[10] = {0};//假设整型数组arr的地址从0开始,一个单元格占四个字节
int *p = &arr[1];//arr[1]的地址为 4
int *q = &arr[7];//arr[7]的地址为28
printf("%d\n",p-q);//结果为 (4 - 28) / 4 = -6
printf("%d\n",q-p);//结果为 (28 - 4) / 4 = 6
printf("%d\n",(short *)q-(short *)p);
//结果为 (28 - 4) / 2 =12 (权重为sizeof(short)四个字节);
printf("%d\n",(long long*)q-(long long *)p);
//结果为(28 - 4) / 8 = 3(权重为sizeof(long long)八个字节);
printf("%d\n",(double *)q-(double *)p);
//结果为(28 - 4) / 8 = 3 (权重为(sizeof(double))八个字节);
printf("%d\n",(unsigned long)q-(unsigned long)p);
//因为没有*,结果为 28 - 4 = 24;
printf("%d\n",(char **)q-(char **)p);
//去掉一个*后为 char *(是一个指针类型,所有的指针类型的权重都为四个字节),(28-4)/4=6;
return 0;
}
图.2
扫描二维码关注公众号,回复:
2510172 查看本文章