指针(地址)运算

指针允许的运算方式有: 
      (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所指向的元素类型所占内存的大小。即上面所说的放大因子。

 

 

 

posted @ 2009-03-11 16:40  淮北橘子  阅读(474)  评论(0编辑  收藏  举报