指针算数
首先给出一个例子
int a[] = {0, 1, 2, 3, 4};
int *ptr = (int *)((&a) + 1);
printf("%d", *(ptr -1));
输出是什么?
正确答案是, 数组a最后一个元素,也就是4。
如果你能够解释这是爲什么,那么就没有必要看下去了。
下面,我们来看一下常见的指针算数
T apple;
T *p = &apple;
这是一个指针的声明,T表示一个类型。
p是一个变量,其值为一个内存地址,T给出了如何对这个地址进行解引用。比如int型,就是说4个字节的内存的二进制补码。
1. 指针与一个整数n相加
p + n的值是 p的值 + n * sizeof(*p)
2. 同一类型的两个指针可以进行减法,运算结果是参与运算的两个指针之间的元素个数(而不是他们之间的字节数)
运算结果可正可负
3. 其它运算均不可以
回到一开始给出的例子,我有两个地方要说的:
1. a与&a值相同,因爲不需要再有一个变量来存储数组名,数组名可以在编译时确定的。与之对应,*ptr与ptr值也相同。由此可见,指针的解引用并不都是直接去取指针值所标识的那块地址的内容。
2. 指针与一个整数的加法已经说过了