czwartek, 26 kwietnia 2018

Język C - Wskaźniki


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.

Poprzednia strona                                                          Następna strona

Brak komentarzy:

Prześlij komentarz