Considérez l'extrait de code suivant :
class Address { int i ; char b; string c; public: void showMap ( void ) ; }; void Address :: showMap ( void ) { cout << "address of int :" << &i << endl ; cout << "address of char :" << &b << endl ; cout << "address of string :" << &c << endl ; }
Il est prévu que la sortie devrait afficher les adresses des variables membres int, char et string. Cependant, l'adresse de la variable char b reste vide.
Cette bizarrerie survient parce que le << L'opérateur interprète &b comme une chaîne de style C plutôt que comme une adresse. Les pointeurs de caractères sont interprétés comme des séquences de caractères terminées par un caractère nul par l'attribut << opérateur.
Pour résoudre ce problème et afficher l'adresse de la variable char, vous pouvez utiliser le code modifié suivant :
cout << "address of char :" << (void *) &b << endl;
Ici, nous utilisons un Casting de style C pour convertir explicitement &b en void *. Ceci indique au << opérateur pour le traiter comme une adresse plutôt que comme une séquence de caractères. Une alternative plus sûre consiste à utiliser static_cast :
cout << "address of char :" << static_cast<void *>(&b) << endl;
Lorsque les variables membres int, char et string sont déclarées publiques, la sortie change légèrement :
... int : something ... char : ... string : something_2
Ici, quelque chose_2 est toujours 8 de moins que quelque chose.
Cette différence se produit parce que le compilateur complète le membre public variables pour les aligner de manière optimale pour l’accès à la mémoire. Dans ce cas, la variable char est probablement complétée à 8 octets, ce qui entraîne une différence d'adresses de 8 octets entre les variables int et string.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!