Jason. Cała informatyka w jednym miejscu!

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 w języku C, zatem o języku C raz kolejny i na pewno nie ostatni :)!

DEREFERENCJA WSKAŹNIKA W JĘZYKU C ZNANA TAKŻE POD HASŁEM "WYŁUSKANIE"

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 wtedy, 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 Ci obcy, kliknij tutaj):

int *px = &x;

A tak wygląda dereferencja wskaźnika w języku C, 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 wskaźnika w języku C nie mieszała przy wartości:

int y = *px;

Wówczas instrukcja, na przykład:

y += 20;

staje się już taka sama jak zwykle i wartość poprzedniej zmiennej jest nienaruszona. "y" jest zwiększone o 20 i spokój. Tak działa dereferencja wskaźnika w języku C.

PRZYKŁAD KODU ŹRÓDŁOWEGO

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. Dereferencja wskaźnika w języku C to jeden z nich, który może brzmi groźnie, jednak po opanowaniu kilku zasad nie jest wcale najtrudniejszą rzeczą na świecie. 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.

PODOBNE ARTYKUŁY