C++ wskaźniki, referencje

C++ wskaźniki, referencje
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0

Heyka, mam takowy problem:

Kopiuj
 
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
int* number = new int;
*number = 10; //oznacza, że w wartośc zmiennej na którą wskazuje wskaznik wstawiam 10 tak ?
int &ref = *number; // co tutaj się dzieje ? wrzucam 10 poniewaz wyluskuje  ale wrzucam to gdzie ?
*number = 9;//oznacza, że w wartośc zmiennej na którą wskazuje wskaznik wstawiam 9 tak ?
number = NULL; //zwalniam pamiec
printf("%d",ref);

//oraz ta też działa

int* number2 = new int;
*number2 = 10; //oznacza, że w wartośc zmiennej na którą wskazuje wskaznik wstawiam 10 tak ?
int ref1 = *number2;// a co tutaj ? pod raf'a wrzucam wartosc 10 bo wyluskuje
*number2 = 9; //oznacza, że w wartośc zmiennej na którą wskazuje wskaznik wstawiam 9 tak ?
number2 = NULL; //zwalniam pamiec
printf("%d",ref1);
	

	system("pause");
	return 0;
}

a zbytnio nie ogarniam różnicy pomiędzy tymi dwoma fragmentami kodu...
i dlaczego pierwszy wypisuje 9 a drugi 10 ?

edytowany 2x, ostatnio: Shial
_13th_Dragon
int &amp;ref - to tak jakby twoja twarz, int ref1 - to tak by też twoja twarz ale na zdjęciu w paszporcie (można powiedzieć kopia). A teraz zastanów się co wolisz aby ktoś walnął w &amp;ref czy w ref?
SH
teraz mi odpowiedz na pytanie kiedy o komentowałem mój problem w kodzie po wyżej.
SH
int &ref = *number; jaśniej to adres zmiennej ref przyjmuje adres zmiennej w ktorej leży nasza 10 ? czyli wartośc na którą wskazuje number ? ale to jak to jest ? przecież wyłuskując *number mam wartosc 10 a co robi w takim razie int &ref ??
Azarien
do ref przypisujesz referencję do zmiennej, wskazywaną przez wskaźnik number. gwiazdka jest dlatego, że chcesz referencję do wskazywanej zmiennej, a nie referencję do wskaźnika.
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

A dlaczego nie dodasz po prostu:

Kopiuj
printf("%p\t%p\n", &ref, number);

i

Kopiuj
printf("%p\t%p\n", &ref1, number2);

Przed przypisaniem NULLa?

Btw. NULL nic nie zwalnia...

Przykladowy output:

Kopiuj
0x8684008	0x8684008
0xbfe00efc	0x8684018

Teraz chyba latwo sie domyslic, dlaczego w jednym jest 9, a w drugim 10.

edytowany 1x, ostatnio: n0name_l
SH
tak racja, po prostu wskaźnik na nic nie wskazuje.
SH
wiem sprawdziłem, po prostu linia int &ref = *number; przyjmuje adres zmiennej która przetrzymuje 10 apotem w tej linii *number = 9; prze edytowujemy ją na 9 więc nasz ref wskazujac ten adres wyswietli 9
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0

Panowie to pytanie z większego kalibru. Kto mi wytłumaczy dlaczego
to jest błędnie
a) double &b = 12.3; //error
to jest dobrze
b) const double &c = 12.3; //OK

_13th_Dragon
proste jak drut: 12.3 to stała nie możesz mieć do niej nie stałej referencji.
n0name_l
krotko mowiac? bo to taki jezyk :P Obie linijki sa co prawda bezsensowne ;) Zaraz zapytasz dlaczego to dziala: http://ideone.com/OSdnXk :>
SH
przepraszam, że może dla was zadaje bez sensowne pytania ale dla mnie mają wartość bo nie wszystkie drobnostki takie znam i próbuję je rozwiązać, zrozumieć.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
1

12.3 to r-value. W C++ do r-value można odnosić się za pomocą stałej referencji lub za pomocą r-value reference z C++11.

W C++ można wyróżnić takie byty (wartości wyrażeń), które nazywają się r-value oraz l-value (od right oraz left). Skrótowo i prosto mówiąc l-value to coś, czego adres można pobrać za pomocą operatora &. Reszta to r-value. Możesz myśleć o r-value jako o czymś, co jest tymczasowe - nie ma przypisanej lokalizacji w pamięci i zmienianie tego nie ma sensu (stąd const).

Nazwy te wywodzą się z C, gdzie określały po której stronie operatora przypisania może stać dana wartość - r-value może stać tylko po prawej stronie.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju
n0name_l
http://ideone.com/BwvEBs, to raczej lvalue nie jest w zadnym wypadku :)
Endrju
Nie masz racji, to jest l-value. (C++11 5.1.1.1)
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0

dobra zadam wam kolejne pytanie natury mornalno filozoficznej...
deklaracja funkcji która przyjmuje jako argumenty tylko np: 6 elementowe tablice int
czy to będzie tak ?
void funkcja(int t[6]);
a jeżeli tak to dlaczego znalazłem taką odpowiedź:
void funkcja(int (&t)[6]);

i czym ona się różni ?

mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
1

Polecam książkę "C++. Kanony wiedzy programistycznej" autorstwa Stephen C. Dewhurst, a w niej rozdziały:

  1. Referencje są aliasami, nie wskaźnikami

  2. Wskaźniki const i wskaźniki na const


<sup>_</sup>
SH
dzięki, jutro pójdę wypożyczyć. A dziś jeżeli znasz odpowiedź to możesz mi jej udzielić.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
3
Kopiuj
void funkcja(int t[6]); // tą 6-kę kompilator jedynie toleruje, czyli olewa, możesz przekazać nawet 1000-elementową lub 3-elementową, sizeof(t)==sizeof(int*)
void funkcja(int (&t)[6]); // tylko 6-elementową możesz przekazać, sizeof(t)==6*sizeof(int)

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Azarien
uzpełnię, że pierwszy zapis jest w zasadzie równoważny z void funkcja(int *t)
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)