Solaris 动态跟踪指南

指针运算

因为指针只是用作内存中其他对象地址的整数,所以 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);
}