102 votes

Comment comparer des pointeurs ?

Supposons que j'ai 2 pointeurs :

 int *a = something;
int *b = something;

Si je veux les comparer et voir s'ils pointent au même endroit, est-ce que (a == b) fonctionne ?

25voto

JaredPar Points 333733

L' == sur les pointeurs comparera leur adresse numérique et déterminera donc s'ils pointent vers le même objet.

20voto

ldgorman Points 669

Pour résumer. Si nous voulons voir si deux pointeurs pointent vers le même emplacement mémoire, nous pouvons le faire. De plus, si nous voulons comparer le contenu de la mémoire pointée par deux pointeurs, nous pouvons également le faire, n'oubliez pas de les déréférencer en premier.

Si nous avons

 int *a = something; 
int *b = something;

qui sont deux pointeurs du même type on peut :

Comparer l'adresse mémoire :

 a==b

et comparer les contenus :

 *a==*b

3voto

La comparaison de pointeurs n'est pas portable, par exemple dans DOS différentes valeurs de pointeur points au même endroit, comparaison des pointeurs renvoie faux.

 /*--{++:main.c}--------------------------------------------------*/
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  int   val_a = 123;
  int * ptr_0 = &val_a;
  int * ptr_1 = MK_FP(FP_SEG(&val_a) + 1, FP_OFF(&val_a) - 16);

  printf(" val_a = %d -> @%p\n", val_a, (void *)(&val_a));
  printf("*ptr_0 = %d -> @%p\n", *ptr_0, (void *)ptr_0);
  printf("*ptr_1 = %d -> @%p\n", *ptr_1, (void *)ptr_1);

  /* Check what returns the pointers comparison: */
  printf("&val_a == ptr_0 ====> %d\n", &val_a == ptr_0);
  printf("&val_a == ptr_1 ====> %d\n", &val_a == ptr_1);
  printf(" ptr_0 == ptr_1 ====> %d\n",  ptr_0 == ptr_1);

  printf("val_a = %d\n", val_a);

  printf(">> *ptr_0 += 100;\n");
             *ptr_0 += 100;

  printf("val_a = %d\n", val_a);

  printf(">> *ptr_1 += 500;\n");
             *ptr_1 += 500;

  printf("val_a = %d\n", val_a);

  return EXIT_SUCCESS;
}
/*--{--:main.c}--------------------------------------------------*/

Compilez-le sous Borland C 5.0, voici le résultat :

 /*--{++:result}--------------------------------------------------*/
 val_a = 123 -> @167A:0FFE
*ptr_0 = 123 -> @167A:0FFE
*ptr_1 = 123 -> @167B:0FEE
&val_a == ptr_0 ====> 1
&val_a == ptr_1 ====> 0
 ptr_0 == ptr_1 ====> 0
val_a = 123
>> *ptr_0 += 100;
val_a = 223
>> *ptr_1 += 500;
val_a = 723
/*--{--:result}--------------------------------------------------*/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X