如果我有两个指针变量a和b,使用语句“a< b”是什么意思?这样做应该比较他们的内存地址的值?如果是这样,计算机中的内存地址顺序是什么?
解决方法
在C和C中,在你有两个指向同一个数组的指针并希望看到它们的相对排序的情况下,允许使用关系运算符比较指针(这个规则有一个例外,我稍后会提到).例如,假设p和q各自指向数组arr的中间位置,如下所示:
int arr[9]; int* p = &arr[1]; int* q = &arr[4]; +-----+-----+-----+-----+-----+-----+-----+-----+-----+ arr | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ | | p q
在这种情况下,表达式p <问:“是数组中的索引,p指向低于q指向的数组中的索引?”在上面的背景下,答案是肯定的.如果p和q被颠倒,或者如果它们指向完全相同的元素,答案就是“不”. C和C中的语言标准都表示比较未指向同一数组的指针的结果是未指定的,这在直觉上是有意义的,因为不相关的对象可能在内存中几乎随机分散,或者在某种程度上相关这是依赖于实现的(你的堆栈是成长还是下降?) 一个例外是,您可以将一个对象超过数组末尾的指针与数组中的指针进行比较.例如,看看这个设置:
int arr[9]; int* p = &arr[1]; int* q = &arr[9]; +-----+-----+-----+-----+-----+-----+-----+-----+-----+ arr | | | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ | | p q
这里,q没有指向数组arr.但是,语言规范允许您安全地比较p和q.这就是为什么,例如,你可以在C中安全地使用这个迭代器风格的循环:
for (int* itr = arr; itr != arr + /* arr's size */; itr++) { ... }