指针算数

 

首先给出一个例子

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值相同,因爲不需要再有一个变量来存储数组名,数组名可以在编译时确定的。与之对应,*ptrptr值也相同。由此可见,指针的解引用并不都是直接去取指针值所标识的那块地址的内容。

 

2. 指针与一个整数的加法已经说过了

 

 

posted on 2011-03-26 16:38  yongmou-  阅读(377)  评论(0编辑  收藏  举报