在C中,我有一个数组int A[20]
。我有两个指针int *pi
和int *pj
分别指向两个条目A[i]
和A[j]
。我不知道i
和j
。我想知道i > j
或j<i
或i==j
。
我的想法是通过比较基于pi
和pj
的{{1}}和pi = A + i
来做到这一点。我想知道pj=A+j
当且仅当i > j
和pi>pj
当且仅当i == j
时是否正确?谢谢!
答案 0 :(得分:4)
是的,指针上的<
和>
运算符被定义为以这种方式工作。
对于未指向同一对象或仅仅指向其末尾的指针,<
和>
的行为未定义。不过,==
和!=
定义明确。
参考:N1570 6.5.8,第5段:
当比较两个指针时,结果取决于相对值 指向的对象的地址空间中的位置。如果两个 指向对象类型的指针既指向同一个对象,也指向两个指向 一个超过同一个数组对象的最后一个元素,他们进行比较 等于。如果指向的对象是同一聚合的成员 对象,稍后声明的结构成员的指针比较大 而不是指向结构中先前声明的成员的指针,和 指向具有较大下标值的数组元素的指针 大于指向同一数组元素的指针 下标值。指向同一个union对象的成员的所有指针 比较平等。如果表达式
P
指向的元素 数组对象和表达式Q
指向的最后一个元素 相同的数组对象,指针表达式Q+1
进行比较 比...更棒 的P
即可。在所有其他情况下,行为未定义。
答案 1 :(得分:2)
是的,这是一个有效的比较。如果
pi = &A[i] = A + i
和
pj = &A[j] = A + j
然后确实
(pi < pj) == (i < j)