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

Pourquoi une erreur/un avertissement est-il présent pour l'opération de relation, mais aucun pour l'opération de comparaison?Quelles sont les restrictions dans la comparaison de deux pointeurs?

+4

Quel est le message d'erreur. Quel compilateur? –

+2

Il y a un "\" 'errant à la fin de' char name1 [20], name2 [20]; \ '' – Gerhardh

+0

..J'ai pensé que c'était un grain de poussière sur l'affichage :( –

Répondre

3

Vous ne pouvez effectuer opérations relationnelles (<, >, <=, >=) sur des pointeurs du même tableau ou même objet global. Sinon, cela provoque undefined behavior.

C11 Citant, chapitre §6.5.8, Opérateurs relationnels, paragraphe 5

Lorsque deux pointeurs sont comparés, le résultat dépend des emplacements relatifs à l'espace d'adressage des objets souligné. Si deux pointeurs vers des types d'objet pointent tous les deux vers le même objet, ou les deux point après le dernier élément du même objet tableau, ils comparent égal. Si les objets pointés sont des membres du même objet agrégé, les pointeurs vers les membres de la structure déclarés plus tard comparent plus que les pointeurs aux membres déclarés plus tôt dans la structure, et les pointeurs vers les éléments de tableau avec les valeurs plus élevées comparent plus que les pointeurs aux éléments de le même tableau avec des valeurs d'indice inférieures. Tous les pointeurs vers les membres d'un même objet union sont égaux. Si les expression P des points à un élément d'un objet tableau et l'expression Q des points au dernier élément du même objet tableau, l'expression de pointeur Q+1 compare supérieure à P. Dans tous les autres cas, le comportement n'est pas défini.

Dans votre code,

if(p1>p2) 

est une tentative de comparer deux pointeurs qui ne font pas partie du même objet tableau, ni les membres de même objet global. Donc, cela déclenche l'avertissement.

Toutefois, à des fins de comparaison, aucune contrainte de ce type n'est retenue, de sorte qu'une expression comme (ip1==ip2) est parfaitement OK.

1

Vous pouvez comparer les pointeurs avec les opérateurs d'égalité (== ou !=) qui pointent vers différents objets ou éléments de différents tableaux. Si les pointeurs ne pointent pas sur le même objet, ils sont considérés comme inégaux.

Plus précisément (la norme C, 6.5.9 Opérateurs d'égalité)

6 Deux pointeurs être égaux si et seulement si les deux sont des pointeurs nuls, les deux sont des pointeurs vers le même objet (y compris un pointeur vers un objet et un sous-objet à son début) ou fonction, les deux sont des pointeurs vers un passé le dernier élément du même objet tableau, ou un est un pointeur à un après la fin d'un objet tableau et l'autre est pointeur vers le début d'un objet tableau différent qui arrive à suivre immédiatement le premier objet tableau dans t il adresse l'espace.

Considérons l'exemple suivant.

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

S'il n'y a pas de remplissage entre les membres de données x et y de la structure, la sortie sera égale à 1 parce que chaque membre de données peut être considéré comme un tableau avec un élément et la « matrice » y immédiatement suit le "tableau" x.

Cependant, vous ne pouvez pas comparer les pointeurs avec les opérateurs relationnels (<, >, <=, >=) qui ne pointent pas aux éléments du même tableau ou passé la fin du même tableau.