Posté par 007 .
En réponse au journal J'adore Linus.
Évalué à 0.
> Non, on peut pas.
Non, on peut pas :-)
J'ai mélangé les pinceaux.
> C'est deux instructions sont complètement équivalentes et ont exactement la même sémantique (pour peu que p soit un pointeur, hein).
Oui c'est complètement équivalent et a la même sémantique.
Si on se "limite" à ça, c'est complètement inutile utiliser NULL au lieu de 0 (3 caractères de plus sans aucune valeur ajoutée).
Je parle de signification.
Puisque 0 est équivalent à null pointer (car le compilo fait une "bidouille") que ce passe-t'il dans ces cas :
static int i ; // équivalent à static int i = 0
static char* p ;
static char *p[10] ; // tableau de pointeur à 0 (bit à 0) ou null pointeur ?
static union {
long i[10] ;
void * p[10] ;
} titi ;
Tous les pointeurs sont initialisés à 0 (bits à 0) ou à null pointeur (qui n'est pas forcément 0) ?
char * p1 = "toto" ;
char * p2 = p1 ;
void * p = (void *)(p1 - p2) ;
C'est équivalent à "(void *)0" . Mais 0 ou null pointer pour p ?
Normalement c'est 0 et pas null pointer. La soustraction de deux trucs valide ne donne jamais NULL. Ici la réponde est 0 et pas null pointeur mais si c'est la même chose qui est stocké sur certaine implémentation.
Dans 99,9 % des cas, on peut remplacer NULL par 0, mais ça n'a pas la même signification.
[^] # Re: Petites precisions
Posté par 007 . En réponse au journal J'adore Linus. Évalué à 0.
Non, on peut pas :-)
J'ai mélangé les pinceaux.
> C'est deux instructions sont complètement équivalentes et ont exactement la même sémantique (pour peu que p soit un pointeur, hein).
Oui c'est complètement équivalent et a la même sémantique.
Si on se "limite" à ça, c'est complètement inutile utiliser NULL au lieu de 0 (3 caractères de plus sans aucune valeur ajoutée).
Je parle de signification.
Puisque 0 est équivalent à null pointer (car le compilo fait une "bidouille") que ce passe-t'il dans ces cas :
static int i ; // équivalent à static int i = 0
static char* p ;
static char *p[10] ; // tableau de pointeur à 0 (bit à 0) ou null pointeur ?
static union {
long i[10] ;
void * p[10] ;
} titi ;
Tous les pointeurs sont initialisés à 0 (bits à 0) ou à null pointeur (qui n'est pas forcément 0) ?
char * p1 = "toto" ;
char * p2 = p1 ;
void * p = (void *)(p1 - p2) ;
C'est équivalent à "(void *)0" . Mais 0 ou null pointer pour p ?
Normalement c'est 0 et pas null pointer. La soustraction de deux trucs valide ne donne jamais NULL. Ici la réponde est 0 et pas null pointeur mais si c'est la même chose qui est stocké sur certaine implémentation.
Dans 99,9 % des cas, on peut remplacer NULL par 0, mais ça n'a pas la même signification.