x
и y
в Main
являются независимыми переменными.Они могут хранить разные значения.Они не могут быть по одному адресу.Обратите внимание, что они значения типа переменные, хотя в этом коде вы вообще не узнаете о ссылочных типах, поскольку он не использует никаких ссылочных типов (кроме * 1008).*, Program
и Console
).
Однако ваш код этого не показывает - он показывает адрес параметра в DisplayMemAddress
, который совершенно другой.Значения x
и y
передаются значением в метод.Было бы полезно, если бы вы переименовали параметр в вашем методе DisplayMemAddress
на z
:
static unsafe void DisplayMemAddress(int z)
{
int* ptr = &z;
Console.WriteLine("0x" + new IntPtr(ptr).ToString("x"));
}
Теперь об этом проще говорить.Вы отображаете адрес z
, а не x
или y
.Этот адрес будет в стеке (как деталь реализации), и, поскольку стек имеет одинаковую высоту в обоих вызовах, он покажет одно и то же значение.Теперь, если вы измените метод для использования передачи по ссылке, вы на самом деле увидите адрес x
и y
:
class Program
{
static void Main(string[] args)
{
int x = 10; // int -> stack
int y = x; // assigning the value of num to mun.
DisplayMemAddress(ref x);
DisplayMemAddress(ref y);
Console.ReadLine();
}
static unsafe void DisplayMemAddress(ref int z)
{
fixed (int* ptr = &z)
{
Console.WriteLine("0x" + new IntPtr(ptr).ToString("x"));
}
}
}
Честно говоря, показываяадреса - не лучший способ узнать о ссылочных типах, типах значений и передаче параметров IMO.
У меня есть пара статей, которые могут вам пригодиться: