100165350.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 242 行 · 第 1/3 页
HTM
242 行
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> (uint)&pY, sizeof(short*), (uint)pY);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine(</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> "Address of pZ=&z is 0x{0:X}, size is {1}, value is 0x{2:X}", </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> (uint)&pZ, sizeof(double*), (uint)pZ);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> *pX = 20;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("After setting *pX, x = {0}", x);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("*pX = {0}", *pX);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> pZ = (double*)pX;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("x treated as a double = {0}", *pZ);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Console.ReadLine();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这段代码声明了</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个值变量:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">int x</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">short y</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">double z</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt; FTEL: 0cm"><span style="FONT-FAMILY: 宋体">还声明了指向这</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个值的指针:</span><span lang="EN-US">px</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">py</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">pz</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">然后显示这</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个变量的值,以及它们的大小和地址。注意在获取</span><span lang="EN-US">px, py</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">pz</span><span style="FONT-FAMILY: 宋体">的地址时,我们查看的是指针的指针,即值的地址的地址!还要注意,与显示地址的常见方式一致,在</span><span lang="EN-US">Console.WriteLine()</span><span style="FONT-FAMILY: 宋体">命令中使用</span><span lang="EN-US">{0:X}</span><span style="FONT-FAMILY: 宋体">格式说明符,确保该内存地址以</span><span lang="EN-US">16</span><span style="FONT-FAMILY: 宋体">进制格式显示。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">最后,使用指针</span><span lang="EN-US">px</span><span style="FONT-FAMILY: 宋体">把</span><span lang="EN-US">x</span><span style="FONT-FAMILY: 宋体">的值改为</span><span lang="EN-US">20</span><span style="FONT-FAMILY: 宋体">,执行一些指针转换,如果把</span><span lang="EN-US">x</span><span style="FONT-FAMILY: 宋体">的内容当作</span><span lang="EN-US">double</span><span style="FONT-FAMILY: 宋体">类型,就会得到无意义的结果。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">编译运行这段代码,在得到的结果中,我们将列出用</span><span lang="EN-US">/unsafe</span><span style="FONT-FAMILY: 宋体">标志进行编译和不用</span><span lang="EN-US">/unsafe</span><span style="FONT-FAMILY: 宋体">标志进行编译的结果:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><strong><span lang="EN-US">csc PointerPlayaround.cs</span></strong></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">Microsoft (R) Visual C# .NET Compiler version 7.10.3052.4</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">for Microsoft (R) .NET Framework version 1.1.4322</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">Copyright (C) Microsoft Corporation 2001</span><span style="FONT-FAMILY: 宋体">–</span><span lang="EN-US">2002. All rights reserved.</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">PointerPlayaround.cs(7,26): error CS0227: Unsafe code may only appear if</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> compiling with /unsafe</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><strong><span lang="EN-US">csc /unsafe PointerPlayaround.cs</span></strong></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">Microsoft (R) Visual C# .NET Compiler version 7.10.3052.4</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">for Microsoft (R) .NET Framework version 1.1.4322</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US">Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><strong><span lang="EN-US">PointerPlayaround</span></strong></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of x is 0x12F8C4, size is 4, value is 10</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of y is 0x12F8C0, size is 2, value is -1</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of y2 is 0x12F8BC, size is 1, value is 4</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of z is 0x12F8B4, size is 8, value is 1.5</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of pX=&x is 0x12F8B0, size is 4, value is 0x12F8C4</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of pY=&y is 0x12F8AC, size is 4, value is 0x12F8C0</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Address of pZ=&z is 0x12F8A8, size is 4, value is 0x12F8B4</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">After setting *pX, x = 20</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">*pX = 20</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">x treated as a double = 2.63837073472194E-308</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17pt"><span style="FONT-FAMILY: 宋体">检查这</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个结果,可以证实我们在本章前面的“后台内存管理”一节描述的堆栈操作,即堆栈给变量向下分配内存。注意,这还证实了堆栈中的内存块总是按照</span><span lang="EN-US">4B</span><span style="FONT-FAMILY: 宋体">的倍数进行分配的。例如,</span><span lang="EN-US">y</span><span style="FONT-FAMILY: 宋体">是一个</span><span lang="EN-US">short(size = 2)</span><span style="FONT-FAMILY: 宋体">,其地址是</span><span lang="EN-US">1243328</span><span style="FONT-FAMILY: 宋体">,表示为该变量分配的内存区域是</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">1243328~1243331</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">。如果</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">.NET</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">运行库严格逐个排列变量,则</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">y</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">应只占用</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">2</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">个存储单元</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">12433328</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">和</span><span lang="EN-US" style="LETTER-SPACING: -0.1pt">1243329</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">11. </span><span style="FONT-FAMILY: 黑体">给示例添加类和结构</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在本节中,使用第二个示例</span><span lang="EN-US">PointerPlayaround2</span><span style="FONT-FAMILY: 宋体">介绍指针的算法,以及结构指针和类成员指针。开始时,定义一个结构</span><span lang="EN-US">CurrencyStruct</span><span style="FONT-FAMILY: 宋体">,把货币值表示为美元和美分,再定义一个对应的类</span><span lang="EN-US">CurrencyClass</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> struct CurrencyStruct</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public long Dollars;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public byte Cents;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public override string ToString()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return "$" + Dollars + "." + Cents;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> class CurrencyClass</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public long Dollars;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public byte Cents;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public override string ToString()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return "$" + Dollars + "." + Cents;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">定义好了结构和类后,就可以对它们应用指针了。下面的代码是一个新的示例。这段代码比较长,我们对此将做详细讲解。首先显示</span><span lang="EN-US">CurrencyStruct</span><span style="FONT-FAMILY: 宋体">结构的字节数,创建它的两个实例和一些指针,再使用</span><span lang="EN-US">pAmount</span><span style="FONT-FAMILY: 宋体">指针初始化一个</span><span lang="EN-US">CurrencyStruct</span><span style="FONT-FAMILY: 宋体">结构</span><span lang="EN-US">amount1</span><span style="FONT-FAMILY: 宋体">,显示变量的</span><span lang="EN-US"> </span><span style="FONT-FAMILY: 宋体">地址:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">public static unsafe void Main()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine(</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> "Size of Currency struct is " + sizeof(CurrencyStruct));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> CurrencyStruct amount1, amount2;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> CurrencyStruct* pAmount = &amount1;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> long* pDollars = &(pAmount->Dollars);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> byte* pCents = &(pAmount->Cents);</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?