Wskaźniki celu-C
Wskaźniki w Objective-C są łatwe i przyjemne do nauczenia. Niektóre zadania programowania Objective-C są łatwiejsze do wykonania za pomocą wskaźników, a innych zadań, takich jak dynamiczna alokacja pamięci, nie można wykonać bez użycia wskaźników. Dlatego konieczne jest nauczenie się wskaźników, aby zostać doskonałym programistą Objective-C. Zacznijmy uczyć się ich w prostych i łatwych krokach.
Jak wiadomo, każda zmienna jest miejscem w pamięci i każda lokalizacja pamięci ma zdefiniowany adres, do którego można uzyskać dostęp za pomocą operatora ampersand (&), który oznacza adres w pamięci. Rozważmy następujący przykład, w którym zostanie wyświetlony adres zdefiniowanych zmiennych -
#import <Foundation/Foundation.h>
int main () {
int var1;
char var2[10];
NSLog(@"Address of var1 variable: %x\n", &var1 );
NSLog(@"Address of var2 variable: %x\n", &var2 );
return 0;
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0
Więc zrozumiałeś, czym jest adres pamięci i jak uzyskać do niego dostęp, więc podstawa koncepcji dobiegła końca. Zobaczmy teraz, czym jest wskaźnik.
Co to są wskaźniki?
ZA pointerjest zmienną, której wartością jest adres innej zmiennej, tj. bezpośredni adres miejsca w pamięci. Jak w przypadku każdej zmiennej lub stałej, należy zadeklarować wskaźnik, zanim będzie można go użyć do przechowywania adresu zmiennej. Ogólną postacią deklaracji zmiennej wskaźnikowej jest -
type *var-name;
Tutaj, typejest typem bazowym wskaźnika; musi to być prawidłowy typ danych Objective-C ivar-namejest nazwą zmiennej wskaźnika. Gwiazdka * użyta do zadeklarowania wskaźnika jest tą samą gwiazdką, której używasz do mnożenia. Jednak w tej instrukcji gwiazdka jest używana do oznaczenia zmiennej jako wskaźnika. Poniżej znajduje się prawidłowa deklaracja wskaźnika -
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
Rzeczywisty typ danych wartości wszystkich wskaźników, niezależnie od tego, czy są to liczby całkowite, zmiennoprzecinkowe, znakowe, czy inne, jest taki sam, długa liczba szesnastkowa, która reprezentuje adres pamięci. Jedyną różnicą między wskaźnikami różnych typów danych jest typ danych zmiennej lub stałej, na którą wskazuje wskaźnik.
Jak używać wskaźników?
Jest kilka ważnych operacji, które będziemy wykonywać bardzo często za pomocą wskaźników. (a) definiujemy zmienną wskaźnikową, (b) przypisać adres zmiennej do wskaźnika, a (c)na koniec uzyskaj dostęp do wartości pod adresem dostępnym w zmiennej wskaźnika. Odbywa się to za pomocą jednoargumentowego operatora*która zwraca wartość zmiennej znajdującej się pod adresem określonym przez jej operand. Poniższy przykład wykorzystuje te operacje -
#import <Foundation/Foundation.h>
int main () {
int var = 20; /* actual variable declaration */
int *ip; /* pointer variable declaration */
ip = &var; /* store address of var in pointer variable*/
NSLog(@"Address of var variable: %x\n", &var );
/* address stored in pointer variable */
NSLog(@"Address stored in ip variable: %x\n", ip );
/* access the value using the pointer */
NSLog(@"Value of *ip variable: %d\n", *ip );
return 0;
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20
NULL wskaźniki w celu C
Zawsze dobrze jest przypisać wartość NULL zmiennej wskaźnikowej na wypadek, gdybyś nie posiadał dokładnego adresu do przypisania. Odbywa się to w momencie deklaracji zmiennej. Wskaźnik, któremu przypisano wartość NULL, nazywany jest anull wskaźnik.
Wskaźnik NULL jest stałą o wartości zero zdefiniowaną w kilku standardowych bibliotekach. Rozważ następujący program -
#import <Foundation/Foundation.h>
int main () {
int *ptr = NULL;
NSLog(@"The value of ptr is : %x\n", ptr );
return 0;
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0
W większości systemów operacyjnych programy nie mają dostępu do pamięci pod adresem 0, ponieważ pamięć ta jest zarezerwowana przez system operacyjny. Jednak adres pamięci 0 ma szczególne znaczenie; sygnalizuje, że wskaźnik nie ma wskazywać dostępnego miejsca w pamięci. Ale zgodnie z konwencją, jeśli wskaźnik zawiera wartość null (zero), zakłada się, że nie wskazuje na nic.
Aby sprawdzić pusty wskaźnik, możesz użyć instrukcji if w następujący sposób -
if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */
Szczegółowe wskazówki dotyczące celu-C
Wskaźniki mają wiele, ale łatwych koncepcji i są bardzo ważne dla programowania Objective-C. Istnieje kilka ważnych pojęć dotyczących wskaźników, które powinny być jasne dla programisty Objective-C:
Sr.No. | Koncepcja i opis |
---|---|
1 | Cel-C - arytmetyka wskaźnika Istnieją cztery operatory arytmetyczne, których można używać na wskaźnikach: ++, -, +, - |
2 | Cel-C - Tablica wskaźników Możesz zdefiniować tablice do przechowywania wielu wskaźników. |
3 | Cel-C - wskaźnik do wskaźnika Objective-C pozwala na umieszczenie wskaźnika na wskaźniku i tak dalej. |
4 | Przekazywanie wskaźników do funkcji w Objective-C Przekazywanie argumentu przez odwołanie lub przez adres umożliwia zmianę przekazanego argumentu w funkcji wywołującej przez wywołaną funkcję. |
5 | Zwróć wskaźnik z funkcji w Objective-C Objective-C umożliwia funkcji zwrócenie wskaźnika do zmiennej lokalnej, zmiennej statycznej i dynamicznie przydzielonej pamięci. |