2
class f2011fq1d
{
    unsafe public static void Main()
    {
       int a = 2;
       int b = 4;
       int* p;
       int* q;
       int[] ia = { 11, 12, 13 };
       p = &a; q = &b;
       Console.WriteLine(*p + a);
       Console.WriteLine(*q / *p);
       Console.WriteLine(*&a + *&b * 2);

       *p = a + *q;
       Console.WriteLine(a + *q);
       fixed (int* r = ia)
       {
           Console.WriteLine(*r + 3);
       }
    } 
}

在这段代码中,我对某些语法感到困惑。例如int* p, 和p = &a做什么?最后一部分是fixed (int* r = ia),那是做什么的?

在源代码中,它还打印了一些值,有人可以解释打印的是什么吗?

4

4 回答 4

7

您正在使用指针和“运算符地址”,这些是通常与 C/C++ 相关联的功能,但在unsafe代码块内的 C# 代码中可用。我建议对这个概念进行一些一般性的研究,因为仅仅理解语法不足以有效地使用它们。我将解释几行;

 int * p; //a pointer (the address of) 4 bytes of memory for an int
 int a = 5; // normal allocation/initialization of int
 p = &a; //sets p  to the address of a. Since p is a pointer, it holds an address
 // ampersand is the 'address of operator', it returns and address. so this assignment works


 p = a // will not compile. int* != int

 p == 5 // will not compile, int* != int

 *p == 5 // true. *pointer dereferences the pointer returning the value
 // found at the address p points to which is 5 so this is true.

 int * q = &a; // another pointer to the memory containing a

 p == q // true, both pointers contain the same value, some address which is usually displayed in hex like 0xFF110AB2

指针的更常见用法是:

int *p;
// do something to get a length for an integer array at runtime
p = new int[size]; 
// now I've allocated an array based on information found at run time!

上述操作在 C/C++ 中很常见,完全必要。在 C# 中,这样做没有意义。它已经在幕后为你完成了,它永远不会出错(比如未能释放我刚刚分配的内存)。

于 2012-12-12T00:48:23.300 回答
1

int* p声明一个名为的变量p,它是一个指向 int 的指针。

p = &a导致p指向内存中与 . 相同的位置a

如果您需要了解此类内容,指针类型(C# 编程指南)可能是一个不错的起点。

于 2012-12-12T00:46:39.770 回答
1

通过unsafe代码,C# 允许您使用诸如 C 之类的指针和地址。 int *p声明一个指向int. p = &a, 获取 的地址a并将其存储在p.

fixed防止垃圾收集器移动数据。

请参阅http://msdn.microsoft.com/en-us/library/chfa2zb8(v=vs.100).aspxhttp://msdn.microsoft.com/en-us/library/f58wzh21(v=vs. 100).aspx

于 2012-12-12T00:48:15.080 回答
1

在这段代码中,我对某些语法感到困惑。例如...

我将尝试一次解决这些问题(没有双关语)

int* p 是什么意思

这声明了一个名为“p”的局部变量,其类型是指向 int 的指针。因此,当将此变量分配给内存地址时,它将读取 4 字节,就好像它们是 int32 一样。

... 和 p = &a

右边的'&a'读作“a的地址”,意思是取我们分配给局部变量'a'的内存位置。将其分配给已经声明的 int 指针“p”,然后我们可以读取“p”以获取实际存储在变量“a”中的值。

最后一部分是固定的 (int* r = ia),它有什么作用?

这与将 p 分配给 a 的地址非常相似,只是没有“地址的”前缀。这是因为变量 'ia' 的类型是一个数组,它被隐式处理,就好像它是一个指针一样。因此,该语句声明了一个 int 指针“r”并将其分配给数组“ia”中第一项的地址。

这里还有一些注意事项:

if (*p == 2) ...

以“*”为前缀的指针将取消对该指针的引用,并将其视为指针类型的变量。因此,在我们的示例中,取消引用指向变量“a”的“p”将导致存储在“a”中的值,2。

*p = 100;

就像在 'p' 指向的地址读取一个值一样,我们也可以写入一个新值。只需取消引用指针并为其分配一个新值。

*&a

这只是为了混淆某人。正如所解释的,它通过前缀“&”获取“a”的地址,但随后取消引用带有“*”前缀的地址。这只是计算为 'a' 并且可以省略两个前缀而不改变行为。

于 2012-12-12T01:02:18.463 回答