Donc, j'ai récemment creusé dans les tableaux de caractères, et j'essaye d'imprimer l'adresse de chaque élément d'un tableau de caractères.
0x69 ice i 0x63 ce c 0x65 e e test.cpp: In function âint main()â: test.cpp:29:23: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] cout<<(void*)a[i]<<" "; ^
Le code ci-dessus me donne la sortie suivante:
char a[4] = {'i','c','e','\0'}; for(int i = 0; i < 3; ++i){ cout<<(void*)a[i]<<" "; cout<<&a[i]<<" "; cout<<a[i]<<endl; }
Je ne suis pas à l'aise avec la sortie de (void *) a [i]
. Les adresses des caractères ne devraient-elles pas être séparées de 1 octet. Je vois 0x69
suivi de 0x63
puis de 0x65
. Y at-il une raison à cela. Et y a-t-il une relation entre la représentation de l'adresse et le signe d'avertissement qu'elle affiche?
3 Réponses :
J'essaye d'imprimer l'adresse de chaque élément d'un tableau de caractères
(void *) a [i]
est en train de convertir l'élément (lechar
) lui-même envoid *
, pas l'adresse du élément.Vous devriez obtenir l'adresse de chaque élément comme suit:
cout<<static_cast<void*>(&a[i])<<" ";Ou mieux utiliser
static_cast
. p >cout<<(void*)&a[i]<<" "; // ^
Votre valeur d'impression convertie en void *
, pour imprimer l'adresse, vous avez besoin de
cout<< static_cast<void*>(&a[i])<<" ";
Actuellement, vous ne recevez pas les adresses. Vous convertissez plutôt les valeurs ASCII des caractères en void *
. C'est pourquoi les valeurs ne sont pas correctes.
Ce que vous voulez faire est d'utiliser un static_cast
et d'obtenir l'adresse de l'élément & a [i]
: p >
cout << static_cast<void*> (&a[i]) << " ";