Если у вас есть опыт программирования на C/C++, то вы должны ясно понимать главное отличие в объявлении указателей в C# и C/C++. При объявлении указателя в C/C++ знак *
int* р, q;
объявляется указатель р типа int и переменная q типа int. Это равнозначно двум следующим объявлениям.
int* р; int q;
А в C# знак *
int* р, q;
создаются две переменные-указателя. Это равнозначно двум следующим объявлениям.
int* р; int* q;
Это главное отличие следует иметь в виду при переносе кода C/C++ на С#.
Операторы * и & в указателях
В указателях применяются два оператора: * и &. Оператор & является унарным и возвращает адрес памяти своего операнда. (Напомним, что для унарного оператора требуется единственный операнд.) Например, в следующем фрагменте кода:
int* ip; int num = 10; ip = #
в переменной ip сохраняется адрес памяти переменной num. Это адрес расположения переменной num в оперативной памяти компьютера. Он не имеет
Второй оператор, *, является дополнением оператора &. Этот унарный оператор находит значение переменной, расположенной по адресу, на который указывает его операнд. Следовательно, этот оператор обращается к значению переменной, на которую указывает соответствующий указатель. Так, если переменнаяipсодержит адрес памяти переменнойnum,как показано в предыдущем примере, то в следующей строке кода:
int val = *ip;
в переменнойvalсохраняется значение10переменнойnum,на которую указывает переменнаяip.Операцию * можно рассматривать как получение значения по адресу. Поэтому приведенный выше оператор присваивания описывается словами следующим образом: "Переменнаяvalполучает значение по адресу, хранящемуся в переменнойip."
Оператор * можно использовать также в левой части оператора присваивания. В этом случае он задает значение, на которое указывает соответствующий указатель, как в приведенном ниже примере.
*ip = 100;