C++ wskaźniki, referencje

0

Heyka, mam takowy problem:

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

0

A dlaczego nie dodasz po prostu:

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

i

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

Przed przypisaniem NULLa?

Btw. NULL nic nie zwalnia...

Przykladowy output:

0x8684008	0x8684008
0xbfe00efc	0x8684018

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

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

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.

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 ?

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

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

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