Kod nienadzorowany

unsafe : słowo kluczowe pozwalające utworzyć blok nie-nadzorowany. W blokach nie-nadzorowanych możemy używać typów wskaźnikowych. Ponadto operacje w tych blokach zwykle działają szybciej (np. nie ma sprawdzania zakresów).

fixed : pozwala blokować obiekty (zmienne) w pamięci. Informuje system, by nie zmieniał położenia w pamięci danego obiektu (standardowo system dowolnie umieszcza i przesuwa obiekty w obrębie sterty - jednak gdybyśmy wskazywali na jakiś obiekt wskaźnikiem, a w międzyczasie zmienił by on swoje położenie, doprowadziło by to do błędów).

Przykładowo:


unsafe void  mojaFunkcja( int[]  tab ) {
  fixed( int*  wsk = tab ) {
    int *w = wsk;
    for( int i=0; i<tab.Length; i++) {
      int a = *w++ ;
    }
  }
} 

Wskaźniki są to zmienne zawierające adres w pamięci innej zmiennej (wskazują na inną zmienną). Możemy ich używać tylko w blokach nie-nadzorowanych (unsafe). Każdy typ bezpośredni lub pośredni posiada odpowiadający mu typ wskaźnikowy - o takiej samej nazwie, ale zakończonej znakiem gwiazdki * (np. typowi int odpowiada typ wskaźnikowy int* ). Typy wskaźnikowe mogą być pomiędzy sobą rzutowane.

Operator * jest w stosunku do wskaźników operatorem wyłuskania - pozwala pobrać wartość znajdującą się pod adresem wskazywanym przez wskaźnik (czyli wartość zmiennej, którą wskazuje wskaźnik).
Np. int a = *wsk; // gdzie wsk jest wskaźnikiem typu int*

Operator & jest używany jako operator pobrania adresu. Wyrażenie &zm zwraca adres w pamięci, pod którym znajduje się zmienna zm.
Np. int* wsk = &liczba ; // liczba jest zmienną typu int
W C# zwracane są wskaźniki tylko do typów bezpośrednich, a nigdy bezpośrednio do typów referencyjnych (wyjątkowo w przypadku tablic i łańcuchów zwracany jest adres pierwszego elementu - oczywiście także jako typ bezpośredni).

Operator -> służy odwoływaniu się do składowych struktury poprzez wskaźnik. Wyrażenie a->b jest równoważne wyrażeniu (*a).b

W stosunku do wskaźników możemy także używać operatorów ++ (wskaźnik będzie wskazywał kolejny element), -- (przesunięcie wskaźnika do poprzedniego elementu), + (ponieważ działanie operatora jest skalowane do rozmiaru wskaźnika, to np. (wsk + 5) oznacza piąty element od elementu wskazywanego przez wskaźnik. Nie można do siebie dodawać dwóch wskaźników.), - (od wskaźnika możemy odjąć wartość typu całkowitego lub inny wskaźnik), [ ] (umożliwia indeksowanie, tzn. wsk[5] jest równoważne *(wsk+5) ) oraz +=

stackalloc : słowo kluczowe pozwalające alokować bloki pamięci na stosie (ponieważ są umieszczone na stosie, po wyjściu z bloku, w którym zostały zadeklarowane, przeznaczona na nie pamięć jest zwalniana).Np.
int* wsk= stackalloc int[10];
System.Console.Write( wsk[5] ) ;

sizeof : zwraca rozmiar struktury. Może być użyty jedynie w blokach unsafe, np. int r = sizeof( int );


prev | Strona Główna | next

Copyright © 2006 Daniel Dusiński
Wszelkie prawa zastrzeżone