指针(地址)运算
指针允许的运算方式有:
(1). 指针在一定条件下,可进行比较,这里所说的一定条件, 是指两个指针指向同一个对象才有意义, 例如两个指针变量p, q指向同一数组, 则<, >, >=,<=, ==等关系运算符都能正常进行。若p==q为真, 则表示p, q指向数组的同一元素; 若p<q为真, 则表示p所指向的数组元素在q所指向的数组元素之前(对于指向数组元素的指针在下面将作详细讨论)。
(2). 指针和整数可进行加、减运算。设p是指向某一数组元素的指针,开始时指向数组的第0号元素, 设n为一整数, 则p+n就表示指向数组的第n号元素(下标为n的元素)。不论指针变量指向何种数据类型, 指针和整数进行加、减运算时,编译程序总根据所指对象的数据长度对n放大, 在一般微机上, char放大因子为1, int、short放大因子为2, long和float放大因子为4, double放大因子为8。对于下面讲述到的结构或联合, 也仍然遵守这一原则。
(3). 两个指针变量在一定条件下,可进行减法运算。设p, q指向同一数组,则p-q的绝对值表示p所指对象与q所指对象之间的元素个数。其相减的结果遵守对象类型的字节长度进行缩小的规则。
#include <stdio.h>
int main()
{
int a[3];
a[0]= 0;
a[1] = 1;
a[2] = 2;
int *p, *q;
p = a;
q = &a[2];
printf("p = %d\n", p);
printf("q = %d\n", q);
printf("q - p = %d\n", q - p);
printf("a[q-p] = %d\n", a[q - p]);
return 0;
}
运算结果:
p = 1245044
q = 1245052
q - p = 2
a[q-p] = 2
Press any key to continue
按理说q - p应该等于8,下面的a[q - p]为a[8], 但是运算结果却是2.这就用到第三条所讲的,p-q的绝对值表示p所指对象与q所指对象之间的元素个数。其相减的结果遵守对象类型的字节长度进行缩小的规则。
我们也可以看成p, q是数组的相对地址,这样容易理解些。就像 *(p + n)是访问的第n- 1个元素一样,并不考虑p所指向的元素类型所占内存的大小。即上面所说的放大因子。