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

Wskaźniki na string

0 głosów
886 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,360 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,040 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,040 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,040 p.)
Uproszczając - tak, wypisuje aż do napotkania \0.

Podobne pytania

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

93,632 zapytań

142,556 odpowiedzi

323,058 komentarzy

63,141 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...