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*/ 

Warum gibt es einen Fehler/eine Warnung für die Vergleichsoperation, aber keine für die Vergleichsoperation?Was sind die Einschränkungen beim Vergleich zweier Zeiger?

+4

Was ist die Fehlermeldung? Welcher Compiler? –

+2

Es gibt eine streunende '\' 'am Ende von' char name1 [20], name2 [20]; \ " – Gerhardh

+0

..Ich dachte, das war ein Staubkorn auf dem Display :( –

Antwort

3

können Sie nur durchführen relationale Operationen (<, >, <=, >=) auf Hinweise aus dem gleichen Array oder gleichem Aggregat-Objekt. Andernfalls wird undefined behavior verursacht.

Zitiert C11, Kapitel §6.5.8, Relationale Operatoren Absatz 5

Wenn zwei Zeiger verglichen werden, hängt das Ergebnis von den relativen Positionen in dem Adressraum der Objekte gezeigt wird. Wenn zwei Zeiger auf Objekttypen beide auf das Objekt zeigen oder beide hinter dem letzten Element desselben Array-Objekts liegen, vergleichen sie mit dem Wert equal. Wenn die Objekte, auf die verwiesen wird, Mitglieder desselben Aggregatobjekts sind, vergleichen Zeiger auf später deklarierte Strukturelemente größer als Zeiger auf zuvor in der Struktur deklarierte Elemente , und Zeiger auf Arrayelemente mit größeren tiefgestellten Werten vergleichen größer als Zeiger auf Elemente von das gleiche Array mit niedrigeren Indexwerten. Alle Zeiger auf Mitglieder desselben Union-Objekts sind gleich. Wenn der Ausdruck P zeigt auf ein Element einer Array-Objekt, und der Ausdruck Q zeigt auf das letzte Element des gleichen Array-Objekt, der Zeiger Ausdruck Q+1 vergleicht größer als P. In allen anderen Fällen ist das Verhalten nicht definiert.

in Ihrem Code

if(p1>p2) 

ist ein Versuch, zwei Zeiger zu vergleichen, die nicht Teil des gleichen Array-Objekt sind, weder Mitglieder der gleichen Aggregat-Objekt. Also löst es die Warnung aus.

Allerdings wird zum Vergleich keine solche Einschränkung gehalten, so dass ein Ausdruck wie (ip1==ip2) vollkommen in Ordnung ist.

1

Sie können Zeiger mit den Gleichheitsoperatoren (== oder !=) vergleichen, die auf verschiedene Objekte oder Elemente verschiedener Arrays zeigen. Wenn die Zeiger nicht auf dasselbe Objekt zeigen, werden sie als ungleich betrachtet.

Genauer gesagt (die C-Standard, 6.5.9 Gleichheitsoperatoren)

6 Zwei Zeiger vergleichen gleich, wenn und nur wenn beide Null-Zeiger sind, beide sind Zeiger auf das gleiche Objekt (einschließlich eines Zeigers auf Ein Objekt und ein Unterobjekt an seinem Anfang) oder Funktion, sind beide Zeiger auf eine nach dem letzten Element des gleichen Array-Objekt oder einer ist ein Zeiger auf eins hinter dem Ende eines Array-Objekts und der andere ist ein Zeiger auf den Anfang eines anderen Array-Objekts, das mit passiert, folgen Sie sofort dem ersten Array-Objekt in t er Adressraum.

Betrachten Sie das folgende Beispiel.

#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; 
} 

Wenn es keine Polsterung zwischen den Datenelementen x und y der Struktur ist dann die Ausgabe gleich 1 sein wird, weil jedes Datenelement kann als ein Array mit einem Element und dem „Array“ y sofort betrachtet werden folgt dem "Array" x.

jedoch nicht Zeiger mit den relationalen Operatoren vergleichen kann (<, >, <=, >=), die Elemente aus dem gleichen Array oder über das Ende des gleichen Array zeigen nicht.