Staly wskaznik do stalego obiektu

Staly wskaznik do stalego obiektu
balti
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:156
0
Kopiuj
 
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 ?

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:11 dni
0

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

balti
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:156
0

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

twonek
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
4

Kierunki przypisywania Ci się pomyliły.

Kopiuj
tmp = *w;

to jest równoważne

Kopiuj
tmp = m;

Możesz zmieniać wartość tmp do woli, ale to nijak się ma do w, który nadal wskazuje na m.

edytowany 1x, ostatnio: twonek
balti
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:156
0

Dzięki :)

Kopiuj
 
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 ??
edytowany 3x, ostatnio: balti
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:29 dni
  • Lokalizacja:Kraków
  • Postów:1055
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ć.


do not code, write prose
edytowany 2x, ostatnio: pingwindyktator
Endrju
C-string wcale nie musi być w pamięci RO. Konwersja char * <-> const char * w C++ nie jest deprecated, tylko jest zabroniona.
pingwindyktator
Tak, bo mazanie po pamięci string literal to UB. Swoją drogą - czytałem, że w C string literal jednak jest w pamięci RO. Ale nie wiem.
Endrju
Literał łańcuchowy może być gdziekolwiek - C++ nie zajmuje się ochroną pamięci. Jest typu const char [] i dlatego nie wolno go modyfikować.
Azarien
zarówno w C, jak w C++ powinno się przy literałach pisać const char* albo const char[], niezależnie od tego czy kompilator pozwala na zapis bez const czy nie.
pingwindyktator
@Azarien: Wydaje mi się, że char [] jest okej, bo string literal zostanie skopiowany do "naszej" pamięci, po której możemy mazać.
Azarien
@pingwindykator: mazać możemy, ale trzeba pamiętać że nie możemy wydłużyć takiego stringa - kolejny potencjalny bug.
pingwindyktator
Racja. Co jednak nie zmienia faktu, że char [] jest jak najbardziej dozwolone. Ale rzeczywiście - powinno się to const dodać. Chyba że (jak zwykle) używamy tego z głową.
Azarien
"z głową" to bym raczej użył jawnego strcpy i tablicy z jawnie podanym rozmiarem - jeśli już miałaby być tablica edytowalna.
pingwindyktator
Tak tylko gdybamy, tak czy siak takich operacji w C++ (o ile tylko można) nie powinno się wykonywać, bo są od tego odpowiednie obiekty.
balti
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 3 lata
  • Postów:156
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)

edytowany 2x, ostatnio: balti
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
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:

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

edytowany 1x, ostatnio: Azarien
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:29 dni
  • Lokalizacja:Kraków
  • Postów:1055
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?

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


do not code, write prose
edytowany 2x, ostatnio: pingwindyktator
Azarien
jeśli funkcja nie modyfikuje stringa, to parametr powinien być const char* albo const char[] - bez różnicy, ważne że z const.
pingwindyktator
@Azarien: powinno być const char* "powinno" tutaj jest błędem. w przypadku char * to MUSI być z const.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)