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

Wskaźniki na string

Aruba Cloud - Virtual Private Server VPS
0 głosów
726 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,340 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,020 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,020 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,020 p.)
Uproszczając - tak, wypisuje aż do napotkania \0.

Podobne pytania

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

93,326 zapytań

142,323 odpowiedzi

322,391 komentarzy

62,655 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...