2013-01-14 2 views
0

J'ai quelques doutes sur le déréférencement des pointeurs C. Vu le code suivant:Déréférencement avec (vide *) devant

void *vptr; // declare as a void pointer type 
int val = 1; 
int *iptr; 

// void type can hold any pointer type or reference 
iptr = &val; 
vptr = iptr; 
printf("iptr=%p, vptr=%p\n", (void *)iptr, (void *)vptr); 

Lorsque nous (void *)iptr, qu'est-ce que nous imprimons en fait? Je pensais que lors de la déréférencement, il devrait imprimer le numéro 1, mais il imprime une adresse. Pourquoi donc? Et pourquoi est-il nécessaire d'ajouter (void *) devant afin d'imprimer l'adresse? Est-ce que iptr ne suffirait pas?

Merci

Répondre

2

Lorsque nous (void *) iptr, qu'est-ce que nous imprimons en fait?

Vous imprimez la valeur du pointeur iptr d'une manière définie par l'implémentation.

Je pensais que quand déréférencement, il faut imprimer le numéro 1, mais il imprime en fait une adresse

Vous n'êtes pas déréférencement quoi que ce soit avec l'opération (void *), vous incantation à void *. Pour imprimer la valeur de l'objet pointé par iptr, vous devez utiliser le spécificateur de conversion d avec l'argument *iptr (ici vous déréférencer le pointeur iptr).

Et pourquoi est-il nécessaire d'ajouter (void *) devant afin d'imprimer l'adresse?

Parce que spécificateur de conversion p nécessite un argument de type void *.

IPtr pas assez?

iptr est un spécificateur de conversion int * mais p nécessite une void *, sans le casting, il invoquerait un comportement non défini.

+0

Merci pour la réponse. J'ai encore le doute quand nous jetons avec (vide *) quelle valeur obtenons-nous? –

+0

@HommerSmith J'ai écrit qu'il imprime la valeur du pointeur d'une manière définie par l'implémentation car le standard C l'a spécifié de cette façon pour le spécificateur 'p'. Cela laisse par exemple le choix pour un compilateur d'imprimer un pointeur nul comme '(nil)' ou '0x0'. Habituellement, il imprime une adresse mémoire hexadécimale. Notez que la valeur de '(void *) iptr' est la même que la valeur de' iptr' sauf que le type est différent. – ouah

1

Lorsque vous écrivez (void*)iptr, vous lancez le pointeur int à un pointeur d'annuler. Le déréférencement d'un pointeur est écrit *iptr. Cela prendra la valeur iptr points à.

Lorsque vous imprimez iptr avec le format %p, vous imprimez l'adresse à laquelle iptr pointe. C'est le même que &val. Si vous souhaitez imprimer la valeur iptr points, utilisez le format %d

printf("*iptr=%d\n", *iptr); 

Cela montrera

* iptr = 1

1

Pour déréférencer un pointeur en C/C++ utiliser le * signe.Ce que vous êtes en train de faire est iptr en tant que pointeur vide. Par conséquent, vous voyez l'adresse imprimée.

Essayez ceci: printf("iptr=%p, vptr=%p\n", *iptr, (void *)vptr); :)

+0

Que fait '* vptr'? –

+0

Je l'ai écrit à la hâte. Le fait de déréférencer un pointeur vide de cette manière résultera en une erreur de compilation. J'ai édité mon post pour corriger ceci. –