Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本铸造问题(C#)_C#_Pointers_Casting - Fatal编程技术网

基本铸造问题(C#)

基本铸造问题(C#),c#,pointers,casting,C#,Pointers,Casting,假设我有一个byte[]数组,我想知道当我创建一个指向该数组的指针,然后将其转换为int时,我到底在做什么。当我取消引用所述int指针时,我会得到一个更大的数字,如下所示:(代码可能有错误) 如预期的那样,pMem、PMemPlus1和PMemPlus2解除了对1、2和3的引用。(int)pMem我认为它是指针的值(内存地址) 当它被转换为int指针时,pArrayBase给出4030201,pArrayBasePlus1给出数字4。后者是有意义的,因为int是4字节长的,对吗。但我不明白。我刚

假设我有一个byte[]数组,我想知道当我创建一个指向该数组的指针,然后将其转换为int时,我到底在做什么。当我取消引用所述int指针时,我会得到一个更大的数字,如下所示:(代码可能有错误)

如预期的那样,pMem、PMemPlus1和PMemPlus2解除了对1、2和3的引用。(int)pMem我认为它是指针的值(内存地址)


当它被转换为int指针时,pArrayBase给出4030201,pArrayBasePlus1给出数字4。后者是有意义的,因为int是4字节长的,对吗。但我不明白。我刚刚取消引用int cast数组指针(pArrayBase)时的结果。有什么解释吗?我可能无法正确理解铸造的概念。

您的记忆安排如下:

01 02 03 04 00 00 00 00

pArrayBase指向数组基址处的四字节整数。由于整数以小尾数格式存储,因此会产生值0x0403001。有趣的结果是当您取消引用pArrayBasePlus1时。pArrayBasePlus1指向前四个字节之后的四个字节。除非您遗漏了一些代码,否则*pArrayBasePlus1应该是0。

如果您使用C编写代码,则更容易创建因铸造错误而出现错误的代码。如果这是您的目标,请不要让自己的生活变得艰难。没有那么多讽刺(不难实现),为什么要强制转换呢?基本上,我一直在学习本教程:geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinted-objects-and.aspx注意,在32位机器上强制转换int指针只是一件明智的事情。如果您有一个64位进程,那么您必须强制转换为long。您可能会考虑将其转换为ItpTR,这是一个保证与指针大小相同的结构。谢谢,我需要查找DeNANNITY等。是的,我的代码有一点错误,而您认为正确的是,PARRAYBASEPLUSS1为零。
01 02 03 04 00 00 00 00