0
int a=40,b=34; 
int *iptr1,*iptr2;       
iptr1 = &a; 
iptr2 = &b;   
printf("\n Equal condition of two pointers=%d", (ip1 == ip2)); //no error 

char name1[20], name2[20]; 
char *p1 = name1; 
char *p2 = name2; 
if(p1 > p2) /*Error*/ 

爲什麼有關於關係操作的錯誤/警告,但沒有用於比較操作?比較兩個指針有什麼限制?

+4

什麼是錯誤信息。什麼編譯器? –

+2

'char name1 [20],name2 [20];'' – Gerhardh

+0

......末尾有一個零星的'\''''''''''''''''''''''''''''''我認爲這是一塊灰塵在顯示屏上:( –

回答

3

只能從相同的陣列或相同聚合對象上執行的指針關係操作<><=>=)。否則,它會導致undefined behavior

引用C11,章§6.5.8,關係運算符,第5段

當兩個指針進行比較,其結果取決於物體的 地址空間中的相對位置指向。如果兩個指向對象類型的指針都指向同一個對象,或者兩個指向同一個數組對象的最後一個元素,則它們的 比較相等。如果指向的對象是同一個聚集對象的成員,則指向稍後聲明的結構成員的指針將比指向結構中較早聲明的成員 的指針要多,指向具有較大下標 的數組元素的指針值會比指向元素的指針大具有較低下標值的相同數組。所有指向同一聯合對象成員的指針都相等。如果 表達式P指向數組對象的元素並且表達式Q指向相同數組對象的最後一個元素,則指針表達式Q+1比較大於 P在所有其他情況下,行爲未定義。

在代碼中,

if(p1>p2) 

是試圖比較兩個指針,其是不一樣的排列對象的一部分,同聚合對象既不成員。所以,它會觸發警告。

但是,作爲比較,不存在這樣的約束,因此像(ip1==ip2)這樣的表達式完全可以。

1

您可以將指針與指向不同對象或不同陣列元素的等號運算符(==!=)進行比較。如果指針不指向相同的對象,則認爲它們不相等。

更精確地(C標準,6.5.9平等運營商)

6兩個指針比較相等當且僅當兩者都爲空指針, 兩者都指向相同的對象(包括一個指針,指向一個對象 和一個子對象在其開頭)或函數,兩者都是指向 的指針,一個指向相同數組對象的最後一個元素,或者一個指針指向一個數組對象的末尾,另一個指向 指向不同數組對象的開始的指針,發生在 之後,緊跟在t中的第一個數組對象他處理空間。

考慮下面的例子。

#include <stdio.h> 

int main(void) 
{ 
    struct A 
    { 
     int x; 
     int y; 
    } a; 

    printf("&a.x + 1 == &a.y is %d\n", &a.x + 1 == &a.y); 

    return 0; 
} 

如果有數據成員x和結構的y之間沒有填充,那麼輸出將等於1因爲每個數據成員可被視爲與一個元素的數組和「陣列」 y立即遵循「陣列」x

然而,你可能不比較關係運算符(<><=>=)不指向同一陣列的或過去的同一陣列的端部元件的指針。