2014-09-12 9 views
6

Rozważmy następujący kod:Dlaczego C++ pokazuje znaki, gdy drukujemy wskaźnik na typ znaku?

char char_a = 'A'; 
int int_b = 34; 

char* p_a = &char_a; 
int* p_b = &int_b; 

cout<<"Value of int_b is (*p_b) :"<< *p_b<<endl; 
cout<<"Value of &int_b is (p_b) :"<< p_b<<endl; 

cout<<"Value of char_a is (*p_a) :"<< *p_a<<endl; 
cout<<"Value of &char_a is (p_a) :"<< p_a<<endl; 

Kiedy go uruchomić, wyjście jest:

enter image description here

Więc dlaczego nie wyświetla adres w przypadku wskaźnika char jak dla wskaźnik liczby całkowitej?

+0

Czy próbowałeś tego kodu na innym komputerze? –

+0

'printf ("% p \ n ", p_a);' – someuser

+0

Tak, sprawdziłem. Jest tam ten sam symbol. –

Odpowiedz

14

Przechodząc wskaźnik do znaku jest interpretowana jako NULL zakończone C ciąg jako członek non std :: ostream < < (ostream &) przeciążenia przeciążenie dla NUL C string (const char *).

template< class CharT, class Traits > 
basic_ostream<CharT,Traits>& operator<<(basic_ostream<CharT,Traits>& os, 
             const char* s); 

jak w twoim przypadku, to tylko znak, a kolejne miejsca pamięci są śmieci, ostream czyta pamięć, dopóki nie natrafi na NULL w strumieniu pamięci.

Jest to zdecydowanie niezdefiniowane zachowanie, ponieważ uzyskiwałbyś dostęp do pamięci poza tymi, które zostały przydzielone do twojego procesu.

Jeśli rzeczywiście trzeba przekazać wskaźnik znaków i wyświetlić adres można wykorzystać sformatowany umieszczający operator<< przeciążenie member aby void *

basic_ostream& operator<<(const void* value); 

Do tego dostępu, potrzebny jest wyraźny wskaźnik obsady z char * do const void *

std::cout << "Value of &char_a is (p_a) :" << static_cast<const void *>(p_a) << std::endl; 
3

Powiedzmy, że masz:

char s[] = "abcd"; 
char* cp = a; 
cout << cp << endl; 

Oczekuje się, że chcesz zobaczyć:

abcd 

na wyjściu.

std::ostream ma przeciążenia, który współpracuje z char const* że dba o drukowaniu abcd w powyższym kodzie, a nie tylko wartości wskaźnika z cp.

Po wywołaniu

cout<<"Value of &char_a is (p_a) :"<< p_a<<endl; 

program oczekuje p_a być zerowa zakończone sznurki. Ponieważ tak nie jest, widzisz śmieci.

3

Operator < < dla std::ostream jest przeciążony dla char * (aby obsłużyć go jako ciąg znaków). Jeśli chcesz wydrukować adres, prześlij go na numer (void *).

Powiązane problemy