基本C#语法问题

基本C#语法问题,c#,syntax,C#,Syntax,在这段代码中,我对一些语法感到困惑。例如,int*p和p=&a做什么?最后一部分是固定的(int*r=ia),这是做什么的 在源代码中,它还打印一些值,有人能解释打印的内容吗?int*p声明一个名为p的变量,该变量是指向int的指针 p=&a导致p指向内存中与a相同的位置 如果您需要了解这类内容,可能是一个很好的起点。对于不安全的code,C#允许您使用指针和地址,如C。int*p声明指向int的指针p=&a,获取a的地址并将其存储在p中 fixed防止垃圾收集器移动数据 请参阅和您正在使用指针

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


在源代码中,它还打印一些值,有人能解释打印的内容吗?

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

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


如果您需要了解这类内容,可能是一个很好的起点。

对于
不安全的
code,C#允许您使用指针和地址,如C。
int*p
声明指向
int
的指针
p=&a
,获取
a
的地址并将其存储在
p

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


请参阅和

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

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

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

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

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

什么是int*p

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

。。。和p=&a

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

最后一部分是固定的(int*r=ia),这是做什么的

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

这里还有一些注意事项:

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

if (*p == 2) ...
就像在“p”指向的地址处读取一个值一样,我们也可以写入一个新值。只需取消对指针的引用并为其指定一个新值

*p = 100;

这只是为了迷惑某人。如前所述,它通过前缀“&”获取“a”的地址,但随后使用“*”前缀取消对地址的引用。这只是计算为“a”,两个前缀都可以省略,而不会改变行为。

我建议学习一点关于C/C++的知识,因为这就是在这些不安全的块中编写的内容。我不会真的考虑C语言的指针部分,我怀疑C文档中有很多关于C语言的文档。C文档是。我会尽量避免“不安全”的代码,只在绝对需要使用的部分。如果你不知道那是什么时候,事实上,因为你对此一无所知;我觉得你还是应该避开这个区域。(虽然看起来没什么问题。)@mayhewr是的,我想说这是不够的解释,除非你已经从C/C++编程中了解了它们。@evanmcdonnal你的意思是“int**p--p是指向整数的指针”,对外行来说不够清楚吗?;)我认为这至少是一个好的开始。上述操作在C中非常普遍——在现代C++中,它们几乎完全不需要。
*&a