普通的数学数字都可以进行基本的算数运算,那么指针也是也代表一种数字,它是否也可以进行基本的算术运算?
1、指针加数字。
指针的加法,我们先定义一个整型数组arr[],再定义一个整型指针*p,让p保存arr[]首地址的值,int *p=arr;
int arr[10] = {1,2,3};
int *p = arr;
我们让p+1;则有下面三种情况
(1)、假设p+1加的是整个数组。
如果*p加的是一整个数组,我们给p+1,则*p就指向了arr外的地址,将变得毫无意义。
如下图所示
p+1加整个数组,*p就指向了数组之外
所以很显然指针p+1加的不是整个数组。
(2)、假设p+1加的是一个字节。
在数组arr中一个单元格占4个字节,如果p+1是指p现在所指向的字节地址加一,则运行以下语句时就会出现这种情况
*p = 10; p++; *p = 20;
*p指向arr的首地址,将10的值赋值给arr[0],然后p+1,
再将20放在*p现在所指的位置
arr[0]的值将会变成0x00000a14,arr[2]的值将会变成0,显然这样指针运算将会变得异常复杂,这不是我们想要的结果。
(3)、假设p+1加的是一个数组单元格。
假设指针p+1是指指针所指的单元格加一,我们就可以通过指针加一来访问目前指针所指数组中元素的下一位元素,就可以通过以下语句将arr[0]赋值成10,将arr[1]赋值成20。
如图所示*p = 10; p++; *p = 20;
显然这就是我们想要的结果。由以上结论得出指针加一是指指针所指数组的单元格加一。
int main() { int arr[10] = {1,2,3}; int *p = arr; *p = 10; p++; *p = 20; printf("%d\n%d\n%d\n",arr[0],arr[1],arr[2]); return 0; }
2、指针减数字。
与指针加数字相同,p-1就是指*p所指的单元格减一,如下所示
int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; for(int *q = &arr[9];q>=arr;q--) { printf("%d ",*q); } return 0; }
3、指针减指针。
既然指针加数字表示的是指针所指数组的格子数加一,那么指针减指针就是指两个指针之间的格子数(指针相减只能在同一个数组的两个指针)。
int main() { int arr[10] = {1}; int *p = &arr[1]; int *q = &arr[9]; printf("%d\n",p-q); printf("%d\n",q-p); return 0; }
4、指针加指针。
指针加指针没有任何意义。
总结:以上示例皆是以int型进行,指针的运算还需要进行调整,调整的权重为sizeof(指针去掉一个*)。以指针加数字为例
int main()
{
int *p = (int *)2000;
printf("%d\n",p+4);
printf("%d\n",(short *)p+4);
printf("%d\n",(double *)p+4);
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;
}
