指针的算术运算包括指针与整数的运算和指针与指针的运算两种。
建议看本文之前先对指针的基本概念进行梳理:http://gaozhiyuan.net/c/pointer-introduce.html
指针与整数的运算
为研究指针与整数的运算,我们以顺序存储结构中的数组为例,进行讲解。因为数组在内存中的每个元素单元是连续的,从低地址到高地址,内存编号(指针)增加。
指针+整数
#include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int* p = a; printf("元素%d的地址是:%p\n",a[0], p); printf("元素%d的地址是:%p\n",a[1], p+1); return 0; }
可以看到,指针变量“p”和“p+1”指向的地址相差4,这个4字节即是int类型变量所占用的字节数。
如图:
总结:
- 指针与整数的运算不能认为是“地址+1”,而是让指针的地址加上一个“指针所指向的数据类型占用字节数”。
- 这里你就应该知道指针为什么要有数据类型了吧。是为了确定指针+1到底是增加多少字节数,如果是int,一般是增加4字节,如果是double类型就增加8字节。移步:为什么指针要有数据类型
指针-整数
#include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int* p = a; printf("%p\n", p+4); printf("%p\n", p+3); printf("%p\n",(p+4)-1); //等价于p+3,相当于往左移了一个元素单元 return 0; }
总结:相当于往左移。
指针与指针的运算
指针-指针
#include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 5}; int* p = a; printf("元素%d的地址:%p\n", *(p+4), p+4); printf("元素%d的地址:%p\n", *(p), p); printf("%d\n", (p+4)-(p)); //两个指针相减 return 0; }
总结:指针与指针的运算并不是两个指针所指向的地址相减。而是指的两者指向的元素相差多少(隔了几个位置)。
指针+指针
指针与指针不允许相加!
指针*指针和指针/指针
这… …你觉得指针和指针相乘和相除代表什么呢??没意义吧~~
显然,都没意义。所以指针与指针的算数运算只能相减,其他的都不可以。