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 ?

- Rejestracja:prawie 10 lat
- Ostatnio:prawie 3 lata
- Postów:156

- Rejestracja:prawie 10 lat
- Ostatnio:prawie 3 lata
- 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:ponad 12 lat
- Ostatnio:29 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-only
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ć.

- Rejestracja:ponad 21 lat
- Ostatnio:2 minuty
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:ponad 12 lat
- Ostatnio:29 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 []

const char*
albo const char[]
- bez różnicy, ważne że z const
.

powinno być const char*
"powinno" tutaj jest błędem. w przypadku char *
to MUSI być z const
.
char *
<->const char *
w C++ nie jest deprecated, tylko jest zabroniona.string literal
to UB. Swoją drogą - czytałem, że w Cstring literal
jednak jest w pamięci RO. Ale nie wiem.const char []
i dlatego nie wolno go modyfikować.const char*
alboconst char[]
, niezależnie od tego czy kompilator pozwala na zapis bez const czy nie.char []
jest okej, bostring literal
zostanie skopiowany do "naszej" pamięci, po której możemy mazać.char []
jest jak najbardziej dozwolone. Ale rzeczywiście - powinno się toconst
dodać. Chyba że (jak zwykle) używamy tego z głową.strcpy
i tablicy z jawnie podanym rozmiarem - jeśli już miałaby być tablica edytowalna.