Pytanie o char*
Ostatnio zmodyfikowano 2014-01-23 02:05
misiu754 Temat założony przez niniejszego użytkownika |
Pytanie o char* » 2014-01-22 20:49:55 Witam, ponieważ jestem początkujący w temacie C++, prosiłbym o przystępną odpowiedź na pytanie (tak, żebym zrozumiał). Z tego co czytałem, wskaźnik jest typem do którego można przypisać adres innej zmiennej (tylko). Dlaczego więc jest dopuszczalna taka definicja
char* wsk = "asd";
"asd" nie jest chyba żadnym adresem. Dlaczego więc mogę taki ciąg przypisać do wskaźnika? Dlaczego, aby go wypisać muszę po prostu napisać
cout << wsk;
a nie, jak w przypadku innych wartości z użyciem operatora wyłuskania? Dlaczego nie jest w takim razie dopuszczalna taka definicja
int *wsk = 1; |
|
oputyk |
» 2014-01-22 20:55:03 char * = "abc" jest adresem, ponieważ to - "abc" jest w kodzie ASCII i może stanowić wartość liczbową. Jeśli napisałeś coś takiego - std::cout << wsk; zamiast std::cout <<* wsk; to oznacza, że na ekranie wypisze Ci adres tego wskaźnika, a nie tego na co on pokazuje. |
|
alixir |
» 2014-01-22 21:14:13 Ja to widzę trochę inaczej, ale nie wiem czy mam rację: Ogólnie zapis char * wsk = "asd"; jest niepoprawny. Prawidłowo powinno wyglądać to tak: const char * wsk = "asd"; . Wtedy kompilator traktuje podany napis jako stały literał, zapisując go do pamięci i zwracając adres. Natomiast cout jest skonstruowany inaczej dla różnych typów, i w tym przypadku traktuje wsk jako tablicę znaków, a więc wypisuje na ekran wszystkie znaki od podanego adresu aż do wystąpienia znaku \0, który na pewno pojawi się gdzieś w pamięci. |
|
pekfos |
» 2014-01-22 21:41:26 Wtedy kompilator traktuje podany napis jako stały literał |
I tak potraktuje. aż do wystąpienia znaku \0, który na pewno pojawi się gdzieś w pamięci. |
Czy 'gdzieś' się w pamięci pojawi, to nie ma znaczenia. Ma być na końcu c-stringa podanego do wyświetlenia. W przeciwnym wypadku, zachowanie programu jest niezdefiniowane. char * = "abc" jest adresem, ponieważ to - "abc" jest w kodzie ASCII i może stanowić wartość liczbową. Jeśli napisałeś coś takiego - std::cout << wsk; zamiast std::cout <<* wsk; to oznacza, że na ekranie wypisze Ci adres tego wskaźnika, a nie tego na co on pokazuje. |
A tu nawet nie wiem, o co chodzi. Pierwszy kod nie ma sensu, "abc" to stała typu wskaźnikowego, wypisanie wskaźnika na std::cout, a dokładniej const char*, powoduje wypisanie wskazywanego tekstu, a nie.. czekaj, adresu zmiennej z adresem na tekst? |
|
Elaine |
» 2014-01-23 02:05:59 "abc" to stała typu wskaźnikowego |
Nie, "abc" jest typu const char[ 4 ] (i dlatego na literałach "działa" sizeof). W dodatku jest to l-wartość, więc można zrobić coś takiego, jak const char( * foo )[ 5 ] = & "five"; .
To, że można to traktować jako wskaźnik to tylko wynik reguły dotyczącej niejawnej konwersji tablicy do wskaźnika. |
|
« 1 » |