6 - Wskaźniki i referencje

Ikona obiektów Cele lekcji
  • Nabycie umiejętności posługiwania się wskaźnikami i referencjami
  • Zapoznanie się z przekazywaniem argumentów funkcji przez wskaźnik i referencję

Ikona obiektów Co powinieneś już wiedzieć?
  • W jaki sposób dane przechowywane są w pamięci komputera
  • Jak przekazać argumenty do funkcji

Ikona obiektów Wskaźniki

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;


Ikona obiektów Operatory new i delete

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;


Ikona obiektów Referencje

Referencja to alias (inna nazwa) obiektu. Referencję tworzy się przy użyciu operatora referencji &, np.

int n=20;
int &ref=n;
ref+=2;


Ikona obiektów Przekazywanie argumentów funkcji przez wskaźnik i referencję

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;
    }


Ikona obiektów Tablica jako argument funkcji

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
}


Ikona obiektu Pytanie Zadania

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