Jason. Cała informatyka w jednym miejscu!

Wyobraźcie sobie, że nawet ze zwykłego przekazywania parametrów aktualnych do funkcji 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 funkcji. W języku jaki opisuję jest jeszcze jeden sposób: przekazywanie przez referencję w języku C. Jak to zrobić i jaki to ciągnie za sobą skutek? Czytajcie, a się dowiecie!

PRZEKAZYWANIE PRZEZ REFERENCJĘ W JĘZYKU C TO PODSTAWA, ŻEBY TO WIEDZIEĆ!

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 referencję:

#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 referencję
	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 referencję. Funkcja "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 Wam to, skoro możecie zwrócić wartość za pomocą słowa "return" ;)?. Pojedynczą wartość tak, ale przekazywanie przez referencję w języku C 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: trudno to dopiero BĘDZIE!

PODOBNE ARTYKUŁY