6 - Wskaźniki i referencje
- Nabycie umiejętności posługiwania się wskaźnikami i referencjami
- Zapoznanie się z przekazywaniem argumentów funkcji przez wskaźnik i referencję
- W jaki sposób dane przechowywane są w pamięci komputera
- Jak przekazać argumenty do funkcji
Wskaźnik to zmienna przechowująca adres w pamięci.
Wskaźnik do zmiennej określonego typu tworzymy używając symbolu *. Przypisanie wartości 0 (lub NULL) zmiennej wskaźnikowej oznacza, że jest to wskaźnik pusty. Aby utworzyć wskaźnik do zmiennej występującej w programie, należy użyć operatora adresu &. Aby uzyskać dostęp do wartości zmiennej wskazywanej przez wskaźnik, używamy operatora dereferencji *, np.
int *wsk=0;
int c=5;
wsk=&c;
*wsk=7;
W celu zaalokowania pamięci na stercie należy użyć słowa kluczowego new. Zwracany adres pamięci należy zapisać do wskaźnika. Aby zwolnić obszar pamięci, używamy polecenia delete, np.
int *wsk=new int;
*wsk=10;
delete wsk;
wsk=0;
W podobny sposób można tworzyć dynamicznie tablice, używając operatorów new i delete[]:
int *t=new int[20];
t[0]=1;
delete [] t;
Referencja to alias (inna nazwa) obiektu. Referencję tworzy się przy użyciu operatora referencji &, np.
int n=20;
int &ref=n;
ref+=2;
Jeśli przekazujemy argumenty funkcji przez wartość, wewnątrz funkcji tworzone są ich lokalne kopie i tylko na nich wykonywane są operacje. Jeśli chcemy, aby zmiany argumentów wykonane wewnątrz funkcji były widoczne po jej zakończeniu, musimy przekazać te argumenty przez referencję lub przez wskaźnik.
Przykład - funkcja swap zamieniająca wartości swoich argumentów:
- przekazywanie argumentów przez referencję:
void swap (int &x, int &y)
{
int temp=x;
}
x=y;
y=temp;
int main()
{
int a=5, b=7;
}
swap(a, b);
return 0;
-
przekazywanie argumentów przez wskaźnik:
void swap (int *x, int *y)
{
int temp=*x;
}
*x=*y;
*y=temp;
int main()
{
int a=5, b=7;
}
swap(&a, &b);
return 0;
Tablicę przekazujemy do funkcji przez wskaźnik. Funkcję przyjmującą jako argument tablicę jednowymiarową możemy zadeklarować na dwa sposoby:
void f1(int t[])
{
//treść funkcji f1
}
lub
void f2(int *t)
{
//treść funkcji f2
}
Jaką wartość wypisze następujący program?
void dodaj2(int x)
{
x+=2;}
int main()
{
int x=1;}
dodaj2(x);
printf("%d",x);
return 0;
3
| |
1
|
A taki program?
void dodaj2(int &x)
{
x+=2;}
int main()
{
int x=1;}
dodaj2(x);
printf("%d",x);
return 0;
3
| |
1
|