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
Zobacz pozostały 1 komentarz
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:około 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:około 9 godzin
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)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.