Na dzisiejszy wieczór mam kolejną małą porcję wiedzy. Pisałem już o tym parę razy w ostatnim czasie jednak występowało to jedynie w roli "epizodycznej". Teraz chcę to osadzić w roli głównej i opisać dokładnie ze szczegółami. Mianowicie, poświęcę artykuł na wyjaśnienie czym jest dereferencja wskaźnika, zatem o języku C raz kolejny i na pewno nie ostatni!

DEREFERENCJA WSKAŹNIKA W JĘZYKU C

Wiem, wiem, wiem. Było o tym tutaj, tutaj i tutaj, aczkolwiek były to jedynie wtrącenia na potrzeby wyjaśnienia innego tematu powiązanego z tym operatorem. Teraz postaram się tym skrawkiem wiedzy wypełnić cały artykuł. To dla porządku powtarzając jeszcze raz, dereferencja polega na dostaniu się do wartości danego obiektu przez aktualny adres na który wskazuje wskaźnik. Operacja ta jest też nazywana "wyłuskaniem" i jest to wykorzystywane gdy pragniemy zmienić wartość o odpowiednim typie danych zachowując tę samą referencję czyli odniesienie do "zwykłego" obiektu danych. Przydaje się to szczególnie przy funkcjach opierających się o przekazywanie parametrów formalnych przez referencję, a także przy korzystaniu z notacji wskaźnikowej dla argumentów tablic.

DZIAŁANIE WYŁUSKIWANIA WSKAŹNIKA

Załóżmy, że mamy następującą zmienną "int":

int x = 57;

Linijkę niżej definiujemy wskaźnik do tego "int'a" (jeśli poniższy zapis jest obcy, klikać tutaj):

int *px = &x;

A tak wygląda dereferencja wskaźnika czyli "dostawanie się" do wartości przez adres na który wskazuje:

*px

Pragnę w tym momencie poruszyć bardzo ważną rzecz! Modyfikowanie wartości wyłuskiwanego wskaźnika ciągnie za sobą konsekwencje z których możecie sobie nie zdawać w ogóle sprawy. W oparciu cały czas o ten sam przykład, jeśli napiszecie następującą instrukcję:

*px += 10;

To zostanie zmodyfikowana wartość zarówno dereferencji wskaźnika jak i obiektu danych na który obecnie wskazuje wskaźnik. Dlaczego? Ponieważ adres czyli nasza referencja pokrywa się z adresem zmiennej "x". Musicie dodać nowy osobny obiekt danych na przykład "y" i podstawić wartość wyłuskanego wskaźnika jeśli chcecie, aby dereferencja nie mieszała przy wartości:

int y = *px;

Wówczas instrukcja, na przykład:

y += 20;

staje się już taka sama i wartość poprzedniej zmiennej jest nienaruszona. "y" jest zwiększone o 20 i spokój.

DEREFERENCJA W AKCJI

Powyższe tłumaczenia skwitujemy ponownie kodem źródłowym z przykładem na żywo. Poniższa treść prezentuje wszystko to, co napisałem w jedną całość:

#include <stdio.h>

int main(void)
{
	int x = 56;
	int *px = &x;
	int y = *px;
	
	*px += 10;
	y += 20;
	
	printf("x = %d, *x = %d, y = %d\n", x, *px, y);
	getchar();
	
	return 0;
}

Proponuję to sobie samodzielnie skompilować i zobaczyć jakie będą wyniki.


To wszystko w tym temacie, dziękuję. Powinienem dać ten wątek zaraz po napisaniu o wskaźnikach, aby się to trzymało kupy. Nie wiedziałem jednak, że konieczna będzie zmiana planów z pisaniem o tablicach jak już wspominałem wcześniej.