Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pytanie o char*

Ostatnio zmodyfikowano 2014-01-23 02:05
Autor Wiadomość
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;
P-102880
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.
P-102881
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.
P-102886
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?
P-102888
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.
P-102911
« 1 »
  Strona 1 z 1