Professional Documents
Culture Documents
Referencja C++08 01 17
Referencja C++08 01 17
Ponieważ argument formalny ma zasięg lokalny (istnieje tylko wewnątrz funkcji), zmiana jego wartości
nie jest widziana w programie wołającym (nawet jeśli argument aktualny i formalny nazywałyby się tak
samo, np. w wywołaniu int i=0; f1(i)).
Aby umożliwić zwrot wartości funkcji przez argument oraz aby uniknąć kopiowania dużych zmiennych
(np. struktur albo tablic), należy w C posłużyć się wskaźnikami. Poniżej wersja programu C++ w stylu C z
użyciem wskaźników:
Pw87aaa
#include "iostream"
using namespace std;
int main()
{
int j = 0, k = 0;
cout << "main: j = " << j << " k = " << k << endl;
f1(j);
cout << "main: j = " << j << " k = " << k << endl;
f2(&j);
cout << "main: j = " << j << " k = " << k << endl;
k = f3(j);
cout << "main: j = " << j << " k = " << k << endl;
k = f4(&j); // adres, nie referencja
cout << "main: j = " << j << " k = " << k << endl;
j = 1; k = 2;
cout << "przed swap: j = " << j << " k = " << k << endl;
swap(&j, &k); // adresy, nie referencje
cout << "po swap: j = " << j << " k = " << k << endl;
return 0;
}
void f1(int i)
{
i++; // zmiana i tylko lokalnie
cout << "f1: i = " << i << endl;
}
void f2(int* i)
{
(*i)++; // i jest wskaznikiem, zmieniamy int pokazywany przez wskaznik (j), nawiasy
sa potrzebne
cout << "f2: i = " << *i << endl;
}
int f3(int i)
{
i++; // zmiana i tylko lokalnie
cout << "f3: i = " << i << endl;
return i; // zwarcamy nowa wartosc i
}
int f4(int* i)
{
(*i)++; // i jest wskaznikiem, zmieniamy int pokazywany przez wskaznik (j), nawiasy
sa potrzebne
cout << "f4: i = " << *i << endl;
return *i; // i jest wskaznikiem, zwracamy int pokazywany przez wskaznik (j)
}
void swap(int* i, int* j)
{
int k = *i;
*i = *j;
*j = k;
}
Dla kompilatora referencja to adres, dla programisty to inna nazwa (synonim, alias) zmiennej. Czyli
deklaracja void f2(int& i); i wywołanie int j=0; f2(j); oznaczają, ze i i j to ta sama zmienna (to
samo miejsce w pamięci, ten sam adres). Deklaracja int& zwalnia programistę z uciążliwej dereferencji
wskaźnika.
Uwaga >> int& w deklaracji to referencja (C++), a &j w wywołaniu to operator adresu (C). Żeby
programistom nie było za łatwo wybrano taki sam znak operatora dla dwóch różnych celów.
int main()
{
int j=0, k=0;
cout << "main: j = " << j << " k = " << k << endl;
f1(j);
cout << "main: j = " << j << " k = " << k << endl;
f2(j);
cout << "main: j = " << j << " k = " << k << endl;
k = f3(j);
cout << "main: j = " << j << " k = " << k << endl;
k = f4(j);
cout << "main: j = " << j << " k = " << k << endl;
j = 1; k = 2;
cout << "przed swap: j = " << j << " k = " << k << endl;
swap(j, k);
cout << "po swap: j = " << j << " k = " << k << endl;
return 0;
}
void f1(int i)
{
i++;