C - Wskaźniki
Wskaźniki w C są łatwe i przyjemne do
nauki. Niektóre zadania programowania C są łatwiejsze dzięki wskaźnikom, a
inne zadania, takie jak dynamiczne przydzielanie pamięci, nie mogą być
wykonywane bez użycia wskaźników. Dlatego konieczne staje się nauczenie
się wskaźników, aby stać się doskonałym programistą C. Zacznijmy je uczyć
się w prostych i łatwych krokach.
Jak wiadomo, każda zmienna jest położona w pamięci, a
każda lokalizacja pamięci ma zdefiniowany adres, do którego można uzyskać
dostęp za pomocą operatora ampersand (&), co oznacza adres w
pamięci. Rozważmy następujący przykład, który drukuje adres zdefiniowanych
zmiennych -
#include <stdio.h>
int
main () {
int var1;
char var2[10];
printf("Adres
zmiennej var1: %x\n", &var1 );
printf("Adres
zmiennej var2: %x\n", &var2 );
return 0;
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje
się następujący wynik:
Adres zmiennej var1: 60ff0c
Adres zmiennej var2: 60ff02
Co to są wskaźniki?
Wskaźnik jest
zmienną, której wartością jest adres innej zmiennej, czyli bezpośredni adres
lokalizacji w pamięci. Podobnie jak każda zmienna lub stała, musisz
zadeklarować wskaźnik przed użyciem go do przechowywania dowolnego adresu
zmiennej. Ogólna forma deklaracji zmiennej wskażnika jest:
typ *var-nazwa;
Tutaj typ jest podstawowym typem
wskaźnika; musi to być poprawny typ danych C, a var-nazwa to
nazwa zmiennej wskaźnika. Gwiazdka * używana do zadeklarowania wskaźnika
to ta sama gwiazdka, która jest używana do mnożenia. Jednak w tym
zestawieniu gwiazdka jest używana do oznaczania zmiennej jako
wskaźnika. Spójrz na niektóre z prawidłowych deklaracji wskaźnika -
int *ip;
/* wskaźnik do typu integer */
double *dp; /* wskaźnik do typu double */
float *fp;
/* wskaźnik do typu float */
char *ch
/* wskaźnik do typu character */
Rzeczywisty typ danych wartości wszystkich wskaźników,
niezależnie od tego, czy są to liczby całkowite, zmiennoprzecinkowe, znakowe,
czy nie, jest taki sam - długa liczba szesnastkowa reprezentująca adres
pamięci. Jedyną różnicą między wskaźnikami różnych typów danych jest typ
danych zmiennej lub stałej, na które wskazuje wskaźnik.
Jak korzystać ze wskaźników?
Jest kilka ważnych operacji, które robimy bardzo
często przy pomocy wskaźników. (a) Definiujemy zmienną
wskaźnika, (b) przypisujemy adres zmiennej do wskaźnika
i (c) w końcu
uzyskujemy dostęp do wartości pod adresem dostępnym w zmiennej
wskaźnika. Odbywa się to przez użycie operatora unarnego *, który
zwraca wartość zmiennej zlokalizowanej pod adresem określonym przez jej
operand. Poniższy przykład wykorzystuje te operacje -
#include <stdio.h>
int main
() {
int var = 20; /* faktyczna deklaracja
zmiennej */
int *ip; /* deklaracja zmiennej
wskaźnika */
ip = &var; /* przechowuj adres
zmiennej w zmiennej wskaźnikowej */
printf("Adres
zmiennej var: %x\n", &var );
/* adres zapisany w
zmiennej wskaźnika */
printf("Adres
zapisany w zmiennej ip: %x\n", ip );
/* uzyskanie dostępu do
wartości za pomocą wskaźnika */
printf("Wartość
zmiennej *ip: %d\n", *ip );
return 0;
}
Gdy powyższy kod zostanie skompilowany i wykonany,
generuje następujący wynik:
Adres zmiennej vae: 60ff08
Adres zapisany w zmiennej
ip: 60ff08
Wartość zmiennej *ip: 20
Wskaźniki NULL
Dobrą praktyką jest przypisanie wartości NULL do
zmiennej wskaźnika w przypadku, gdy nie masz dokładnego adresu do
przypisania. Odbywa się to w momencie deklaracji zmiennej. Wskaźnik,
który ma przypisaną wartość NULL, nazywany jest wskaźnikiem pustym.
Wskaźnik NULL jest stałą o wartości zero zdefiniowanej
w kilku standardowych bibliotekach. Rozważmy następujący program -
#include <stdio.h>
int main
() {
int *ptr = NULL;
printf("Wartość
zmiennej ptr to : %x\n", ptr );
return 0;
}
Gdy powyższy kod zostanie skompilowany i wykonany,
generuje następujący wynik:
Wartość zmiennej ptr to 0
W większości systemów operacyjnych programy nie mają
dostępu do pamięci pod adresem 0, ponieważ pamięć jest zarezerwowana przez
system operacyjny. Jednak adres pamięci 0 ma szczególne znaczenie sygnalizuje,
że wskaźnik nie ma wskazywać na dostępną lokalizację pamięci. Ale zgodnie
z konwencją, jeśli wskaźnik zawiera wartość zerową (zero), zakłada się, że nic
nie wskazuje.
Aby sprawdzić wskaźnik zerowy, możesz użyć instrukcji
"if" w następujący sposób:
if (ptr) / * się
powiedzie, jeśli p nie jest puste * /
if (! ptr) / * powiedzie
się, jeśli p jest puste * /
Wskaźniki w szczegółach
Wskaźniki są bardzo ważne dla programowania
C. Następujące ważne koncepcje wskaźnika powinny być jasne dla każdego
programisty C -
L.p.
|
Pojęcie i opis
|
1
|
Arytmetyka wskaźnikowa
Istnieją cztery operatory arytmetyczne, które mogą
być używane w wskaźnikach: ++, -, +, -
|
2
|
Tablica wskaźników
Możesz zdefiniować tablice do przechowywania wielu
wskaźników.
|
3
|
Wskaźnik do wskaźnika
C pozwala mieć wskaźnik na wskaźniku i tak dalej.
|
4
|
Przekazywanie wskaźników do funkcji w C
Przekazywanie argumentu przez odniesienie lub adres
umożliwia zmianę przekazywanego argumentu w funkcji wywołującej za pomocą
wywoływanej funkcji.
|
5
|
Zwracanie wskaźnika z funkcji w C
C pozwala funkcji zwrócić wskaźnik do zmiennej
lokalnej, zmiennej statycznej i dynamicznie alokowanej pamięci.
|
Brak komentarzy:
Prześlij komentarz