指针就是内存单元的地址,因此指针也是一种数据,是一个值。因此指针也有属于自己的算术运算。指针的算术运算大概可以分为这么几类:
1、指针与数字的运算 2、指针与指针的运算
一、指针与数字的运算。
首先,我们要先定义一个数组arr[],然后在定义一个整型指针*p,让指针*p来保存数组arr[]的地址,也就是保存数组arr[]的首地址。
int arr[10] = {1,2,3};
int *p = arr;
指针加一个数字就是这个指针向右移动几个单元格,指针减几个数字就是向左移动几个单元格。
指针p + 1就是代表指针向右移动一个单元格。
指针p - 1就是代表指针向左移动一个单元格。
例如:我们给arr[0]赋值为10,arr[1]赋值为20,我们可以通过以下语句来实现
*p = 10;
p++;
*p = 20;
如图所示:
我们利用printf将结果输出,可以得到
同理指针减数字也是一样的,指针向左移动
如果我们知道指针的所指的的地址之后,怎么才能计算出指针进行运算后的地址呢?
这个时候我们就需要一定的数据调整,而调整的权重为sizeof(不同的数据类型,权重不同,如int为4个字节,double为8个字节),如下图示例:
int main()
{
int *p = (int *)2000;
printf("%d\n",p+4);
printf("%d\n",(short *)p+4);
printf("%d\n",(double *)p+4);//2032
printf("%d\n",(float **)p+4);
printf("%d\n",(unsigned short *)p+4);
printf("%d\n",(long *)p+4);
printf("%d\n",(char *)p+4);
printf("%d\n",(unsigned long long)p+4);
return 0;
}
可以得到以下结果
这就是指针加数字的算法。
再来说指针与指针的运算,首先指针+指针是没有意义的,所以我们只研究指针减指针。
指针减指针只能存在与同一个数组的两个指针中进行。
我们分别定义两个指针和一个数组,并让两个指针分别指向这个数组的首元素和末尾元素。如下
int main()
{
int arr[10] = {1};
int *p = &arr[1];//x+4
int *q = &arr[9];//x+36
printf("%d\n",p-q);
printf("%d\n",q-p);
printf("%d\n",(short *)q-(short *)p);
printf("%d\n",(double *)q-(double *)p);
printf("%d\n",(char *)q-(char *)p);
return 0;
}
可以得到:
总结:指针的所有算术运算都需要调整,调整的权重为sizeof。