#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
char s='l';
LPSTR strpoint=&s;
cout << strpoint << endl;
return 0;
}
Dlaczego jest taki dziwny output zamiast normalnego adresu w pamięci zmiennej s?
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
char s='l';
LPSTR strpoint=&s;
cout << strpoint << endl;
return 0;
}
Dlaczego jest taki dziwny output zamiast normalnego adresu w pamięci zmiennej s?
Rzutowanie zrób: cout << (void*)strpoint << endl;
, czy tam cout << static_cast<void*>(strpoint) << endl;
bardziej w stylu C++.
Tak się dzieje ponieważ to na co wskazuje strpoint
to jeden znak, a nie ciąg zakończony NULL
jak by oczekiwał ostream
, operator<<
z ostream
traktuje LPSTR
jako wskaźnik na ciąg, a nie wskaźnik.
std::cout
jest typu std::ostream
, a typ ten ma przeładowany operator <<
:
wewnętrznie: http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/
zewnętrznie: http://www.cplusplus.com/reference/ostream/ostream/operator-free/
strpoint
to u ciebie LPSTR
czyli de facto const char *
, czyli zostanie wykonany poniższy operator:
ostream& operator<< (ostream& os, const char* s);
I ten operator na wyjściu poda kolejne znaki, które leżą pod wskaźnikiem, aż będzie '\0'.
Jeśli chcesz aby był użyty inny operator, np. chcesz wyświetlić adres, no to musisz castować:
cout << (void *)strpoint;
cout << static_cast<void *>(strpoint);
Poza tym, sama idea:
char s='l';
LPSTR strpoint=&s;
jest średnia, ponieważ brakuje '\0' na końcu.