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 );