因为指针只是用作内存中其他对象地址的整数,所以 D 提供了一组功能来对指针执行运算。但是,指针运算与整数运算并不完全相同。指针运算通过将指针引用的类型大小与操作数相乘或相除,来隐式调整基础地址。以下 D 代码段将说明此属性:
int *x; BEGIN { trace(x); trace(x + 1); trace(x + 2); }
此代码段创建整数指针 x 并跟踪其值,首先将值递增 1,然后将值递增 2。如果创建并执行此程序,DTrace 会报告整数值 0,4 和 8。
因为 x 是指向整数的指针(大小为 4 字节),递增 x 将对基础指针值增加 4。在使用指针来引用连续存储位置(如数组)时,此属性很有用。例如,如果将数组 a 的地址赋给 x(如图 5–2 中所示),则表达式 x + 1 将等价于表达式 &a[1]。类似地,表达式 *(x + 1) 将引用值 a[1]。每次使用 +=、+ 或 ++ 运算符递增指针的值时,D 编译器将实现指针运算。
在从左边的指针中减去某个整数时、从一个指针中减去另一个指针时或者对指针应用 -- 运算符时,也将应用指针运算。例如,以下 D 程序将跟踪结果 2:
int *x, *y; int a[5]; BEGIN { x = &a[0]; y = &a[2]; trace(y - x); }