Да, в CIL есть тип для представления неуправляемых указателей.Они аналогичны управляемым указателям (ref
и out
в C #, &
в CIL), за исключением того, что GC игнорирует их и вы можете выполнять над ними некоторые арифметические операции (те, которые имеют смысл с указателями).
Интересно, что тип указателя содержит информацию о целевом типе (например, int32*
), но все арифметические операции основаны на байтах.
Например, следующий метод C ++ / CLI:
void Bar(int *a)
{
a[5] = 15;
}
создает следующий CIL, когда он находится внутри ref class
(как сообщает Reflector):
.method private hidebysig instance void Bar(int32* a) cil managed
{
.maxstack 2
L_0000: ldarg.1 // load the value of a pointer to the stack
L_0001: ldc.i4.s 20 // load the number 20 (= 4 * 5) to the stack
L_0003: add // add 20 to the pointer
L_0004: ldc.i4.s 15 // load the number 15 to the stack
L_0006: stind.i4 // store the value of 15 at the computed address
L_0007: ret // return from the method
}