Wyobraźcie sobie, że nawet ze zwykłego przekazywania parametrów aktualnych do metod można zrobić temat na artykuł. Ja tak zrobiłem, gdyż i tutaj występuje zróżnicowanie w pisaniu. Większość języków programowania przekazuje zwykle do funkcji kopię wartości, co ma uchronić przed utratą wartości pierwotnej znajdującej się na zewnątrz danej metody. Język C umożliwia jeszcze jeden sposób: przekazywanie przez referencje. Jak to zrobić i jaki to ciągnie za sobą skutek? Czytajcie, a się dowiecie!

JĘZYK C OBSŁUGUJE PRZEKAZYWANIE PRZEZ REFERENCJE

Może Was dziwić nazwa "referencja", natomiast już spieszę z wyjaśnieniem. Chodzi o zachowanie identycznego adresu pamięci wskazującego na tę samą zmienną. Podając zmienną do funkcji, przekazujemy jedynie wartość, która z kolei jest przypisywana zmiennej lokalnej będącej parametrem formalnym funkcji (łopatologicznie, to jest zmienna podana w nawiasach). Ona z kolei jest poddawana operacjom bądź podstawieniom w środku bloku funkcji, a następnie jest usuwana z pamięci. Natomiast przekazując adres takiej zmiennej, zachowujemy jej odniesienie czyli wspomnianą wcześniej "referencję", a to z kolei umożliwia modyfikowanie tej samej zmiennej, która znajduje się na zewnątrz funkcji i zachowanie tych zmian po jej zakończeniu. Widzicie różnicę?

To teraz zastosowanie praktyczne. Przyjrzyjcie się poniższemu kodowi źródłowemu, który zamienia wartości obu liczb całkowitych wykorzystując przekazywanie przez referencje:

#include <stdio.h>

void swap(int *a, int *b);

int main(void)
{
	int x = 50, y = -100;
	
	printf("Wartosci liczb x i y to: %d i %d.\n", x, y);
	swap(&x, &y);			// przekazywanie przez referencje
	printf("Wartosci liczb x i y to: %d i %d.\n", x, y);
	getchar();
	
	return 0;
}

void swap(int *a, int *b)
{
	int temp = *a;
	
	*a = *b;
	*b = temp;
}

Powyższy program wykorzystuje przekazywanie przez referencje. Metoda "swap" pobiera adresy dwóch zmiennych typu liczba całkowita i zamienia wartości. W języku C, adres przekazuje się za pomocą przedrostka w postaci "ampersandu" (&). Efekt jest taki, że funkcja zamienia liczby miejscami, modyfikacje są stałe i obyło się bez zwracania wartości (występuje typ "void").

Możecie sobie myśleć "na co mi to, skoro mogę zwrócić wartość za pomocą słowa "return"?". Pojedynczą wartość tak, ale przekazywanie przez referencje nie tylko pozwala uniknąć zwracania wartości, ale również umożliwia modyfikację WIELU wartości pod rząd znajdujących się na zewnątrz!


Dzięki za przeczytanie. Powyższy trik jest pierwszym krokiem do opanowania operacji na wskaźnikach. Dobrze myślicie: to jeszcze jest łatwe.

PODOBNE ARTYKUŁY