Impression des adresses de mémoire d’élément de tableau C et C ++, pourquoi une sortie différente?

Dupliquer possible:
Comment simuler le format% p de printf avec std :: cout?

J’essaie d’imprimer les adresses de mémoire d’éléments de tableau en C et C ++.

En C:

char array[10]; int i; for(i =0; i<10;i++){ printf(" %p \n", &array[i]); } 

J’ai les adresses de mémoire: 0xbfbe3312 , 0xbfbe3313 , 0xbfbe3314 , ...

Mais si j’essaie de faire la même chose en C ++:

 char array[10]; for(int i =0; i<10;i++){ std::cout<<&array[i]<<std::endl; } 

J’ai eu cette sortie:

P

k

Pourquoi est-ce différent? Devrais-je utiliser le cout différemment en C ++ pour imprimer les adresses de mémoire? Comment dois-je imprimer les adresses de mémoire?

Convertissez l’adresse en void* avant d’imprimer, en C ++, l’ operator<< de ostream est surchargé pour (const) char* sorte qu'il considère qu'il s'agit d'une chaîne de style c:

 char array[10]; for(int i =0; i<10;i++){ std::cout << static_cast(&array[i]) << std::endl; } 

Voir aussi cette réponse de la mienne .

Le type de &array[i] est char* , et donc cout<< pense que vous voulez imprimer une chaîne.

std::cout ne traite pas nécessairement les pointeurs comme des pointeurs. Un pointeur char* pourrait être une ssortingng , par exemple. Prendre l’adresse d’un élément dans un tableau de caractères génère la sous-chaîne à partir de ce point.

Vous devez lancer &array[i] to void*

 for(int i =0; i<10;i++){ std::cout<<(void*)&array[i]< 

En effet, les stream C ++ fonctionnent différemment pour différents types. Par exemple, lorsque vous lui transmettez char* , vos données sont traitées comme une chaîne de caractères. Par conséquent, elles sont imprimées comme une liste de caractères.

Vous devez explicitement indiquer à C ++ que vous souhaitez imprimer une adresse par transtypage.

Au fait (void*) n’est pas la meilleure façon de le faire car vous devriez éviter le casting de type C. Utilisez toujours le transtypage de style C ++ ( static_cast , dynamic_cast , static_cast ). Dans ce cas, static_cast fera le travail.