2010-05-01 4 views
1

Prenons l'exemple ci-dessousPointeurs et adresses

int nCount[2] = {5,10}; 
int* ptrInt; 
ptrInt = nCount; 
cout<<ptrInt<<Endl;//this will print the address of arrar nCount 

maintenant considérer cette

char *str = "Idle mind is a devil's workshop"; 
int nLen = strlen(str); 

char* ptr; 
ptr = new char[nLen+1]; 

strcpy(ptr,str); 

cout<<ptr<<endl;//this wil print the string 

mais ce ne devrait pas être l'impression de l'adresse str. Je ne comprends pas vraiment la différence.

Répondre

7

Étant donné que char* s sont fréquemment utilisés pour stocker des chaînes, l'ostream operator<< est surchargé pour char* afin d'imprimer la chaîne pointée au lieu du pointeur.

Si vous souhaitez afficher le pointeur, vous pouvez le placer sur void*, puis le sortir.

1

Si vous voulez l'adresse:

cout << (void *) ptr < <endl; 

L'opérateur < < est surchargé pour beaucoup de types - pour char *, il imprime une chaîne, pour void * elle imprime l'adresse.

1

Eh bien, il y a une surcharge pour l'opérateur de flux qui traite char* comme un cas particulier. Tous les autres types de pointeurs utilisent la surcharge void*. Voici la surcharge pertinente de l'opérateur de flux à partir des normes:

basic_ostream<charT,traits>& operator<<(const void* p); // all types of pointers 

template<class charT, class traits> // except for c-strings 
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, 
const char*); 
+0

Les flux standards peuvent gérer d'autres types de caractères mais ce n'est qu'un détail que je n'ajouterais pas à ma réponse. – AraK