Staly wskaznik do stalego obiektu

0
 
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 ?

0

Wskaźnik na coś wskazuje, tak działa świat.

0

Czyli ustawilismy go by pokazywal na cos innego a przeciez mial byc wskaznik nieruchomy.

4

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.

0

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 ??
3

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 read-only a wynika to z tego, że tutaj L 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ć.

0

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)

0
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.

0
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 []

1 użytkowników online, w tym zalogowanych: 0, gości: 1