int m = 5,n=4,tmp;
const int *const w = &m; // w jest stalym wskaznikiem mogacym pokazac na obiekt int ktory jest staly i oczywiscie musimy go juz ustawic by na cos pokazywal :p
*w = 15; // staly wskaznik do stalego obiektu czyli nie mozemy zmienic wartosci.
w=&n; // i oczywiscie takim wskaznikiem nie mozemy poruszac sie
tmp = *w; // Tego nie rozumiem (czy to znaczy ze za pomoca takiego wskaznika moge mimo wszystko pokazac jakas wartosc zmiennej w tym wypadku tmp ?
Staly wskaznik do stalego obiektu
- Rejestracja: dni
- Ostatnio: dni
- Postów: 156
- Rejestracja: dni
- Ostatnio: dni
Wskaźnik na coś wskazuje, tak działa świat.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 156
Czyli ustawilismy go by pokazywal na cos innego a przeciez mial byc wskaznik nieruchomy.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2500
Kierunki przypisywania Ci się pomyliły.
tmp = *w;
to jest równoważne
tmp = m;
Możesz zmieniać wartość tmp do woli, ale to nijak się ma do w, który nadal wskazuje na m.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 156
Dzięki :)
char * stacja= "wansee";
cout << *stacja; // wyswitli sie samo "w" natomiast zapis cout << stacja pokaze mi calego stringa. Dlaczego tak ? (dlatego ze kazdej "literce" odpowiada inny adres ?) tzn chodzi o kod ascii ??
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
Dlatego, że cout << *stacja; to cout << stacja[0];
Swoją drogą, zapis char *stacja = "wansee" nie jest do końca poprawny w C++. W C literał (string literal) jest typu char [], natomiast w C++ jest to typ const char []. Dlaczego?
Otóż istnieje również różnica między zapisem char [] a char *, mianowicie (język C):
string literal użyty w char L[] = "some string" jest inicjalizacją tablicy L (coś jak L[0] = 's', L[1] = 'o', ..., elementy są kopiowane), natomiast użyty w char *L = "some string" literał jest rozumiany jako statyczna tablica i owa tablica może być przechowywana jedynie w pamięci a wynika to z tego, że tutaj read-onlyL jest faktycznym wskaźnikiem na napis "some string" znajdujący się gdzieś w pamięci a napis ten jest stały.
// teraz C++
Możemy dokonywać konwersji const char [] na const char *. Jak pisałem, wyrażenie "wansee" jest typu const char [], zatem poprawne użycie to:
const char *stacja = "wansee". Użycie tego bez const powoduje warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] a wzięło się to prawdopodobnie z historyjki o języku C, którą przytoczyłem - czyli raczej ze względu na bezpieczeństwo i mniej bugable kod.
Możemy również zrobić char stacja[] = "wansee" z prostego powodu: jak już pisałem, tutaj elementy są kopiowane, to działa jak inicjalizacja tablicy (chyba?).
Zatem możliwe i legalne jest char stacja[] = "wansee"; stacja[4] = 'f'. Bo nie odwołujemy się do faktycznego string literal, ale do jego kopii stworzonej w czasie kompilacji (chyba x2?) programu wyłącznie na nasze potrzeby.
Czyli:
powinieneś albo zrobić char stacja[] albo const char *stacja.
Dużo tu technicznych rzeczy i okazji do pomyłki, więc jeśli ktoś zauważy błąd to uprzejmie proszę o przebaczenie. I załuje za grzeczy.
edit: nie bierz sobie tego do serca, powinieneś używać std::string i już. Ale warto wiedzieć.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 156
Dzięki a jakoś tak lecę symfonie c++ pokolei i akurat autor używa duzo char * zamiast stringow (chyba chcial pokazac jak mozna ustawic wskaznik na ciag znakow)
- Rejestracja: dni
- Ostatnio: dni
balti napisał(a):
Dzięki a jakoś tak lecę symfonie c++ pokolei i akurat autor używa duzo char * zamiast stringow (chyba chcial pokazac jak mozna ustawic wskaznik na ciag znakow)
Jak robisz coś takiego:
const char *tekst = "jakiś napis";
to powinno być z const.
Podobnie w parametrach funkcji, jeśli funkcja nie modyfikuje stringa, powinno być const char*.
Jeśli char* jest np. zmienną w pętli, w której modyfikujesz napis - to siłą rzeczy musi być bez const.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Kraków
- Postów: 1055
Azarien napisał(a):
Podobnie w parametrach funkcji, jeśli funkcja nie modyfikuje stringa, powinno być
const char*.
@Azarien: Chyba nie rozumiem. Chodzi o coś takiego?
void func (char *_string) { }
int main () {
func("halo");
}
bo kod ten jest oczywiście niepoprawny, a Ty używasz jedynie powinno.
Zdaje się, że chodziło Ci ciągle o char []