• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki na string

Object Storage Arubacloud
0 głosów
469 wizyt
pytanie zadane 6 sierpnia 2020 w C i C++ przez Feszyn F Flora Początkujący (320 p.)
otagowane ponownie 6 sierpnia 2020 przez Feszyn F Flora

Witam , ogólnie to rozumiem już sporo zagadnięć ze wskaźnikami ,lecz nurtuje mnie jeszcze jedna rzecz 

int main()
{
    char n[] = "witam";
    char *p;
    p =n;
    cout <<p;

    return 0;
}

p wypisuje napis  "witam"  ,dziwi mnie to ,ponieważ gdyby to była tablica znaków int ,to p wypisywało by adres pierwszego elementu. Dlaczego p nie wypisuje adresu ,lecz cały napis ? 

1 odpowiedź

+1 głos
odpowiedź 6 sierpnia 2020 przez Oscar Nałogowiec (29,290 p.)

Bo piszesz w C, ale użyłeś elementów C++ - strumieni i przeciążania funkcji (operatorów). Operator << jest przeciążony i dla różnych typów argumentów może zachowywać się różnie (są to różne funkcje). Wersja dla char * wyświetla napis.

Jeśli chcesz wyświetlić adres zrzutuj wskaźnik na void *.

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

 

komentarz 6 sierpnia 2020 przez Feszyn F Flora Początkujący (320 p.)
Czyli mam przez to rozumieć ,że  operator << traktuje char* jako zwykły string i nie ma dla niego znaczenia ,że jest to "zmienna wskaźnikowa ?
komentarz 6 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

std::basic_ostream<> ma przeciążony operator << dla C-style casta, by kończył wypisywanie na terminatorze. Generalizując istnieją dwa przeciążenia char const* dla c-stringów i void const* dla reszty. Dokumentacja też o tym mówi, jeżeli będziesz chciał, to http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf proszę. 

komentarz 6 sierpnia 2020 przez Feszyn F Flora Początkujący (320 p.)
Nie rozumiem tego do końca , operator << jest przeciążony ,ale co to znaczy? Że char* dla << są różne funkcje operator<< i funkcja << dla char* jest taka ,że jest on traktowany jako zwykły string ?
komentarz 6 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

Na początku analogia. Masz dwa noże, jeden do masła i drugi do wszystkiego. Jeden nóż jest wyspecjalizowany do smarowania masłem, a drugi jest ogólny, zrobisz nim wszystko co chcesz, ale do masła nadaje się średnio. I tak jest w tym przypadku. operator<< dla char* wypisuje aż do napotkania \0(terminatora), a drugi wypisze jedną komórkę z pamięci. Bo taka ich charakterystyka.  

Apropo przeciążeń:
https://en.cppreference.com/w/cpp/language/operators
https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm

 

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ 

stream buffers (2)
ostream& operator<< (streambuf* sb );
 
ostream& operator<< (ostream& (*pf)(ostream&));

http://www.cplusplus.com/reference/streambuf/streambuf/ 

komentarz 7 sierpnia 2020 przez Feszyn F Flora Początkujący (320 p.)
Operator dla char* wypisuje wszystkie wartości stringa , które znajdują się pod komórkami w pamięci ram aż do \0 ? To by mówiło też dlaczego ampersand nie działa w tym przypadku
komentarz 7 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Uproszczając - tak, wypisuje aż do napotkania \0.

Podobne pytania

0 głosów
3 odpowiedzi 345 wizyt
pytanie zadane 16 października 2016 w C i C++ przez timrh Mądrala (6,030 p.)
0 głosów
1 odpowiedź 394 wizyt
pytanie zadane 6 lipca 2016 w C i C++ przez rattle Użytkownik (510 p.)

92,555 zapytań

141,403 odpowiedzi

319,556 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...