tag:blogger.com,1999:blog-16902460881485161192023-11-16T19:59:32.924+08:00Virtuoustao的窝A new beginning...Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.comBlogger15125tag:blogger.com,1999:blog-1690246088148516119.post-26392792078646773412013-08-12T14:38:00.001+08:002013-08-12T14:38:19.073+08:00解决Word2013与搜狗输入法冲突,导致卡与连字的现象<div class="MsoNormal">
<span lang="EN-US">Word2013</span><span style="font-family: "微软雅黑","sans-serif";">默认情况下与第三方输入法有冲突,导致第三方输入法卡,并且出现连字现象(打一个字母出现</span><span lang="EN-US">N</span><span style="font-family: "微软雅黑","sans-serif";">个),包括谷歌输入法、搜狗输入法都有这个现象。这其实是由于</span><span lang="EN-US">Word2013</span><span style="font-family: "微软雅黑","sans-serif";">的一个输入法控制功能导致的,关掉即可解决。</span></div>
<div class="MsoNormal">
<span style="font-family: "微软雅黑","sans-serif";">方法是:</span></div>
<div class="MsoNormal">
<span style="font-family: "微软雅黑","sans-serif";">点左上角"文件→选项→高级→编辑选项"找到"输入法控制处于活动状态",取消勾选即可,如下图:</span></div>
<div class="MsoNormal">
<span lang="EN-US"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNvJ8XlDkrjEi6deHpEczmCjw2HXsRUIlxiSjLDRZAuuka2_5TJ4ZlwKqJFCoI4yRSgfdL0r5PtFt8h_9aokOTXYs6EkhPIcZnD2PGXsAQfJoATsNIssKIM1Z9RxRcG-g48q9hIlRiWNVx/s1600/image001-761346.png"><img alt="" border="0" height="171" id="BLOGGER_PHOTO_ID_5911116944152203522" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNvJ8XlDkrjEi6deHpEczmCjw2HXsRUIlxiSjLDRZAuuka2_5TJ4ZlwKqJFCoI4yRSgfdL0r5PtFt8h_9aokOTXYs6EkhPIcZnD2PGXsAQfJoATsNIssKIM1Z9RxRcG-g48q9hIlRiWNVx/s400/image001-761346.png" width="400" /></a></span><span lang="EN-US"><o:p></o:p></span></div>
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-70352914478866961332013-07-19T10:43:00.002+08:002013-07-19T10:44:50.215+08:00解决Word插入对象时的“用于创建此对象的程序是Package。”错误<br />
Word在插入文件对象时,容易出现以下错误:<br />
<br />
"用于创建此对象的程序是Package。您的计算机尚未安装此程序或此程序无响应。若要编辑此对象,请安装Package或确保Package中的任何对话框都已关闭。"<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMMRDV8mh_zoQbjoTgd0Enezbr3yz_ssfLPJ8BI9HKUwXE3ikqyCV89_PWyooHgsgJXscJXJfYY_gkIZ-pH_ll3i-T3qTDIhch0LlgmwK8NACNEygnlbTD0zdfOiEggtTonSjxDIL8DoQ_/s1600/image001-715168.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMMRDV8mh_zoQbjoTgd0Enezbr3yz_ssfLPJ8BI9HKUwXE3ikqyCV89_PWyooHgsgJXscJXJfYY_gkIZ-pH_ll3i-T3qTDIhch0LlgmwK8NACNEygnlbTD0zdfOiEggtTonSjxDIL8DoQ_/s320/image001-715168.png" /></a><br />
<br />
网上有两种主流的解决方法:<br />
拷贝Packager.exe到System32下。<br />
删除Normal.dot。<br />
<br />
这两种方法我试过都不管用(我的是Word 2013)。后来经过研究,发现有另一种方法可以插入文件对象,虽然稍微麻烦点,但成功率高。具体方法:<br />
<br />
在插入选项卡中找到"对象"按钮,如下图:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe5do2lrecUsAn6747vF75SZbblADPEQwtbljNDtNZn_1tAoa88QFN4HaIi7w_OvYo1pejyX4Gv3HvBG_BVkXFekeWCopfuLGQ95fhVOoVxQ55rxB-srnQJBU7oZjXkHj-qzutAzXyRqk_/s1600/image003-716794.jpg"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe5do2lrecUsAn6747vF75SZbblADPEQwtbljNDtNZn_1tAoa88QFN4HaIi7w_OvYo1pejyX4Gv3HvBG_BVkXFekeWCopfuLGQ95fhVOoVxQ55rxB-srnQJBU7oZjXkHj-qzutAzXyRqk_/s320/image003-716794.jpg" /></a><br />
<br />
在"对象"对话框中,选择"新建"选项卡,"对象类型"选择"Package"并确定。注意不要勾选"显示为图标",否则不会显示插入文件的文件名。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtOqYyNNWJCmX-3Y6grdWIrIHsSaJZSrM1ytnWoJxVfbRmQkaMTO_ztWX3noiMHQksktYv5FqTOqeAwgDVJC4GYx2akofdYN-z7HKoGDlpJCkAb1b93CHDADkUQJBCxVumnnQCn4b2sZx3/s1600/image004-718584.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtOqYyNNWJCmX-3Y6grdWIrIHsSaJZSrM1ytnWoJxVfbRmQkaMTO_ztWX3noiMHQksktYv5FqTOqeAwgDVJC4GYx2akofdYN-z7HKoGDlpJCkAb1b93CHDADkUQJBCxVumnnQCn4b2sZx3/s320/image004-718584.png" /></a><br />
<br />
在"创建软件包"对话框中选择你要插入的文件。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQ9ZRWxwAAyrAxppJVvaVz0WQEocby3aXhc8J7r8ZIe8ve8GxrWWAe3tYgFDhrIinoE6endp3ZVbMpX-ve4VjQkbJEO20hDveUbKdIM6M9cKQAdT6ph18bmAoBPz1_QMm2NS8xZB0Ei3Y/s1600/image006-719889.jpg"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQ9ZRWxwAAyrAxppJVvaVz0WQEocby3aXhc8J7r8ZIe8ve8GxrWWAe3tYgFDhrIinoE6endp3ZVbMpX-ve4VjQkbJEO20hDveUbKdIM6M9cKQAdT6ph18bmAoBPz1_QMm2NS8xZB0Ei3Y/s320/image006-719889.jpg" /></a><br />
<br />
然后,就没有然后了。问题解决。<br />
<br />
<br />
<!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-STFeMaojWUE%2FUeilHGd4EII%2FAAAAAAAAABE%2FqIipIIW7OeM%2Fs320%2Fimage003-716794.jpg&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe5do2lrecUsAn6747vF75SZbblADPEQwtbljNDtNZn_1tAoa88QFN4HaIi7w_OvYo1pejyX4Gv3HvBG_BVkXFekeWCopfuLGQ95fhVOoVxQ55rxB-srnQJBU7oZjXkHj-qzutAzXyRqk_/s320/image003-716794.jpg" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F4.bp.blogspot.com%2F-xccYFWPCXFs%2FUeilHlJ7apI%2FAAAAAAAAABQ%2FDaUaAuRZQG8%2Fs320%2Fimage004-718584.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtOqYyNNWJCmX-3Y6grdWIrIHsSaJZSrM1ytnWoJxVfbRmQkaMTO_ztWX3noiMHQksktYv5FqTOqeAwgDVJC4GYx2akofdYN-z7HKoGDlpJCkAb1b93CHDADkUQJBCxVumnnQCn4b2sZx3/s320/image004-718584.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-jPHMYjd3aTc%2FUeilHxytyiI%2FAAAAAAAAABc%2F62Dw92t2Ths%2Fs320%2Fimage006-719889.jpg&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQ9ZRWxwAAyrAxppJVvaVz0WQEocby3aXhc8J7r8ZIe8ve8GxrWWAe3tYgFDhrIinoE6endp3ZVbMpX-ve4VjQkbJEO20hDveUbKdIM6M9cKQAdT6ph18bmAoBPz1_QMm2NS8xZB0Ei3Y/s320/image006-719889.jpg" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-bBh6xh6BS_c%2FUeilG58U0WI%2FAAAAAAAAAA4%2FUo62qL27eqs%2Fs320%2Fimage001-715168.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMMRDV8mh_zoQbjoTgd0Enezbr3yz_ssfLPJ8BI9HKUwXE3ikqyCV89_PWyooHgsgJXscJXJfYY_gkIZ-pH_ll3i-T3qTDIhch0LlgmwK8NACNEygnlbTD0zdfOiEggtTonSjxDIL8DoQ_/s320/image001-715168.png" -->Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-43758948109468552182013-06-20T18:53:00.000+08:002013-06-20T18:53:47.091+08:00为OpenWRT重新生成新的dropbear私有Key<br />
<br />
对于所有的SSH登录来说,必须重新配置新的SSH Key,默认的Key是公共的,大家都知道,理论上不需要中间人攻击就可以<br />
<br />
破解传输的数据。<br />
OpenWRT使用的是dropbear作为SSH服务端,因此Key的生成与OpenSSH不太一样,以下是方法:<br />
重新生成RSA的Key:<br />
root@Gateway:/etc/dropbear# rm dropbear_rsa_host_key<br />
root@Gateway:/etc/dropbear# dropbearkey -t rsa -f dropbear_rsa_host_key -s 2048<br />
重新生成DSS的Key(此Key只能是1024位):<br />
root@Gateway:/etc/dropbear# rm dropbear_dss_host_key<br />
root@Gateway:/etc/dropbear# dropbearkey -t dss -f dropbear_dss_host_key -s 1024<br />
打印指定Key的MD5指纹:<br />
root@Gateway:/etc/dropbear# dropbearkey -y -f dropbear_rsa_host_key<br />
<br />Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-61034593253189209142013-05-27T20:42:00.001+08:002013-05-27T20:42:11.202+08:00Word2013撤销功能无法使用的解决方法<br />
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">最近</span><span lang="EN-US">Word2013</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">出现了一个奇怪的问题,撤销按钮一直是灰色。做编辑时闪一下,又变为灰色。按</span><span lang="EN-US">Ctrl-Z</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">也不管用。网上查询,得知解决方法(但是未找到确切原因):</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">关闭</span><span lang="EN-US">Word2013</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">主程序,然后</span><span lang="EN-US">Win+R</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">调出运行窗口,执行</span><span lang="EN-US">Winword.exe /safe</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">,然后关闭窗口,再正常打开文档,发现撤销功能又回来了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">参考:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"><a href="http://answers.microsoft.com/zh-hans/office/forum/office_2013_release-word/word2013-%E6%92%A4%E6%B6%88%E5%8A%9F%E8%83%BD/4e6ade1f-3713-41f0-beb1-a2797e27d3cf?msgId=7a5fe372-dbd3-4e0e-8e73-3bf60ac761a0">http://answers.microsoft.com/zh-hans/office/forum/office_2013_release-word/word2013-%E6%92%A4%E6%B6%88%E5%8A%9F%E8%83%BD/4e6ade1f-3713-41f0-beb1-a2797e27d3cf?msgId=7a5fe372-dbd3-4e0e-8e73-3bf60ac761a0</a><o:p></o:p></span></div>
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-73971778602281988182013-05-20T14:52:00.005+08:002013-05-20T14:52:56.361+08:00gdb常用调试命令<br />
第一步:如果用gdb调试,需要在gcc编译时添加调试符号,要用-g参数。例如:gcc test.c -o test -g<br />
第二步:使用gdb ./test载入程序。这时GDB会载入test但不会执行。<br />
第三步:使用以下命令进行调试,刚开始一定要先设置断点,否则直接运行完毕了。<br />
<br />
<br />
直接回车<span class="Apple-tab-span" style="white-space: pre;"> </span>执行上次命令(单步调试时很有用)<br />
l 10<span class="Apple-tab-span" style="white-space: pre;"> </span>查看第十行上面五行和下面五行代码<br />
b 6<span class="Apple-tab-span" style="white-space: pre;"> </span>第六行设置断点(行号可以用l查看到)<br />
b main<span class="Apple-tab-span" style="white-space: pre;"> </span>在main函数设置断点<br />
info b<span class="Apple-tab-span" style="white-space: pre;"> </span>查看断点列表<br />
r<span class="Apple-tab-span" style="white-space: pre;"> </span>运行代码<br />
p n<span class="Apple-tab-span" style="white-space: pre;"> </span>查看变量n的值<br />
n<span class="Apple-tab-span" style="white-space: pre;"> </span>单步调试next(单步跳过)<br />
s<span class="Apple-tab-span" style="white-space: pre;"> </span>单步调试step(单步进入)<br />
c<span class="Apple-tab-span" style="white-space: pre;"> </span>恢复运行<br />
finish<span class="Apple-tab-span" style="white-space: pre;"> </span>执行到返回<br />
help [command]<span class="Apple-tab-span" style="white-space: pre;"> </span>查看命令帮助<br />
q<span class="Apple-tab-span" style="white-space: pre;"> </span>退出gdb<br />
set args<span class="Apple-tab-span" style="white-space: pre;"> </span>指定运行时参数(如:set args 10 20 30 40 50)<br />
show args<span class="Apple-tab-span" style="white-space: pre;"> </span>查看设置好的运行参数<br />
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-44429842858701942642013-05-18T23:49:00.002+08:002013-05-18T23:49:29.297+08:00深入研究C语言中.h和.c文件的关系<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:RelyOnVML/>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
table.MsoTableGrid
{mso-style-name:网格型;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<br />
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">一些基本概念</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">在进入主题之前,我们先了解一些基本内容。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">语言是面向过程的编程语言,</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">语言没有包(命名空间),没有明确的私有和公有函数,一旦你定义了函数,理论上可以被整个程序调用(这里先不讨论折中的</span><span lang="EN-US">static</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">类型的函数)。不论你编辑了几万个还是几十万个</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">源程序,最终经过编译,会变成单个二进制可执行文件。在这个文件里所有函数都是平等的,没有公私之分。如果反汇编,可以看到这些函数按顺序一个接一个的排在代码段,并且入口地址是固定的。</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">内核也不例外,</span><span lang="EN-US">Linux</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">内核其实就是一个巨大的二进制可执行文件。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">由上可以得出,</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件的多少,只是根据人的“管理难易程度”决定的。如果你不介意,你可以将所有的程序都写在一个</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中,这样反而提高了</span><span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的效率,</span><span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">不用再去拼接</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件了。</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">对于特殊的</span><span lang="EN-US">static</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">类型的函数,它的特殊之处在于,它并不是保存在代码段,而是保存在静态区,因此造成了它的特殊性,这里不再展开讨论。</span><span lang="EN-US"></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数定义是有顺序的</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这个概念比较简单,但也是万恶之源。对于标准</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">来说,函数有先后顺序。如果</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数定义在</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数之后,那么在</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中不能直接调用</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">(对于编译器来说,可以成功编译运行,但会有警告),因此需要在</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">之前先声明</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数(关于声明与定义的区别见后文)。例子:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include <stdio.h></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">int main() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>A();</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>return 0;</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void A() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>printf("I'm function A.\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>B();</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void B() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>printf("I'm function B.\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">编译器警告:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.c:9:6: </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">警告:与‘</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">’类型冲突</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.c:4:2: </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">附注:‘</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">’的上一个隐式声明在此</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.c:14:6: </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">警告:与‘</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">’类型冲突</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.c:11:2: </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">附注:‘</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">’的上一个隐式声明在此</span><span lang="EN-US"></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">换句话说,标准</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">不会自动寻找函数,默认仅仅会查找已处理过的函数,没查到就认为违反标准了。还是上面的例子,编译器处理到</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">时,</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">还没有处理到,结果</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中有对</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的调用,就警告了。由于标准</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">在这方面的规定,就有了这一篇文章。</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">声明与定义的区别:</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">声明仅仅是告诉编译器有这个东西,是一种描述,不会占用内存。定义则会根据声明的结构,产生实际的内存占用。换句话说,定义是对声明的一个实现。这就类似于面向对象中类与对象的关系。</span><span lang="EN-US"></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">解决函数定义的顺序问题</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">既然函数定义是有顺序的,那我们写代码就非常麻烦了,写一个</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数还得提心吊胆的看看将要调用的</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数是不是在</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">前面,一旦函数增多,程序员必然崩溃,这比</span><span lang="EN-US">goto</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">语句都来的爽。当然,你也可以放任自流,结果会是换来编译器的一大堆警告。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">为了解决这个问题,我们可以将所有的函数生命在</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件的头部。这样我们在写代码时,想怎么调用就怎么调用了。刚才的程序我们可以这么写:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include <stdio.h></span></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span lang="EN-US">void
A();</span></b></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span lang="EN-US">void
B();</span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">int main() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>A();</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>return 0;</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void A() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>printf("I'm function A.\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>B();</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void B() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>printf("I'm function B.\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">因此,我们写完函数后,顺便在头部加个声明。这样在整个</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中都可以调用了。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">显然我们不满足于在单个文件中无忧无虑的调用,我们还会在其它文件中调用。但是如果直接在其它文件中调用</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,仍然有警告(</span><span lang="EN-US">GCC</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">虽然可以编译通过并运行,但这种隐式声明比出错更隐蔽,更不容易发现问题)。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">当然,我们不止这么一个问题。还有,如果我们在</span><span lang="EN-US">A</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中声明了一个结构体,那么在</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中无法使用。如果想要在</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中使用,需要在</span><span lang="EN-US">B</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中重新声明。如果我们定义了一个全局的结构体,那我们需要在每个</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中声明一遍。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="color: red;">.h</span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件的由来</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">上面提了两个问题,这正是</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件要解决的。</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中主要包含的就是函数声明、结构体声明、宏定义。那</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件是如何解决上文两个问题的呢?实际上,编译器在处理</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件时,仅仅是将</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件复制到</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件的头部,这样我们就不难理解了。一旦将</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件复制到</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中,那在</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中使用函数、结构体、宏定义都自由了,因为已经声明过了。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这也是为什么在</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中会加入对自己</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件的调用,例如:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">void A();</span></div>
<div class="MsoNormal">
<span lang="EN-US">void B();</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include <stdio.h></span></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span lang="EN-US">#include
"test.h"</span></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">int main() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>A();</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>return 0;</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void A() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>printf("I'm function A.\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>B();</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void B() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>printf("I'm function B.\n");</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">加粗部分会被</span><span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的内容覆盖,这样可以自由调用</span><span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中的函数而不用担心顺序问题。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们也可以很方便的在其它</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中使用</span><span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的函数,我们只需要包含</span><span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">即可。例如:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test2.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include "test.h"</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void C() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-spacerun: yes;">
</span>B();</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这样,编译器会把</span><span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中的内容复制到</span><span lang="EN-US">test2.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的头部,然后再编译。这相当于在</span><span lang="EN-US">test2.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中声明了</span><span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中的函数,这样再使用</span><span lang="EN-US">test.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中的函数就不会出现“隐式声明”的警告了。如果</span><span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中还有结构体的声明,那么在</span><span lang="EN-US">test2.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中也可以自由使用</span><span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中的结构体。可以看出,</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件的存在,就是为了解决函数定义顺序问题以及不同</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件间的函数调用问题。下面还会证明,在编译器看来</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件与</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件没有区别。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="color: red;">#include "..."</span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">与</span><span lang="EN-US" style="color: red;">#include <...></span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的区别</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">他俩区别主要在于编译器搜索路径不一样。引号一般是引用用户自己的头文件,编译器会搜索用户目录。尖括号一般是引用系统提供的头文件,编译器会搜索系统头文件目录。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">还有一点,对于大型工程来说,用户的头文件可能会分别放在不同的子目录下,引号可以加相对路径或者绝对路径来指定头文件的位置,例如:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">#include "arch/test.h"</span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这样制定的是源码根目录下的</span><span lang="EN-US">arch</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">目录下的</span><span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">头文件。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="color: red;">.h</span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">与</span><span lang="EN-US" style="color: red;">.c</span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">必须在一起吗?</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件不一定非要和</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件放在一起。上文我们说过,编译器只是将</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件内容拷贝到</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中,我们大可以将他们分开。很多程序都是</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">一伙,</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">放到另一伙的。只要我们</span><span lang="EN-US">include</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">时指定的位置正确即可。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">后缀名必须是</span><span lang="EN-US" style="color: red;">.h</span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">吗?</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这是约定俗成的东西,实际上编译器不会根据后缀名区分代码文件,在编译器里,这些文件都是文本文件,性质都是一样的。你甚至可以把头文件命名为</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,代码文件命名为</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,然后在</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件中“</span><span lang="EN-US">#include "xxx.c"</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这样,我们就对</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件有了更进一步的了解。实际上,</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件只不过是程序员们约定的东西,用来方便大家写代码和集成代码。解决我们前面提到的那些不方便(不用在每个</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中重复声明某个函数、结构体或宏定义)。</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">为什么</span><span lang="EN-US" style="color: red;">.h</span></b><b style="mso-bidi-font-weight: normal;"><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">里尽量不要放函数的定义?</span><span lang="EN-US" style="color: red;"></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这点主要是因为,大家约定好</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">用来声明函数,并且知道头文件可能会被很多不同的</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">代码文件包含。如果</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件包含函数定义,那么两个及以上的地方引用了这个头文件,就会出现在两个及以上的地方都包含了相同的函数定义,这属于重复定义了。例如:</span><span lang="EN-US"></span></div>
<div class="MsoNormal">
<span lang="EN-US">test.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">void C() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-tab-count: 1;"> </span>return;</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span lang="EN-US">test1.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include "test.h"</span></div>
<div class="MsoNormal">
<span lang="EN-US">void A() {</span></div>
<div class="MsoNormal">
<span lang="EN-US">...</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span lang="EN-US">test2.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include "test.h"</span></div>
<div class="MsoNormal">
<span lang="EN-US">void B() {</span></div>
<div class="MsoNormal">
<span lang="EN-US">...</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">编译器合并这些</span><span lang="EN-US">.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">和</span><span lang="EN-US">.c</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">文件,会产生如下的效果:</span><span lang="EN-US"></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr style="mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;">
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">void C() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-tab-count: 1;"> </span>return;</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void A() {</span></div>
<div class="MsoNormal">
<span lang="EN-US">...</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void C() {</span></div>
<div class="MsoNormal">
<span lang="EN-US"><span style="mso-tab-count: 1;"> </span>return;</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void B() {</span></div>
<div class="MsoNormal">
<span lang="EN-US">...</span></div>
<div class="MsoNormal">
<span lang="EN-US">}</span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">显然</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">重复定义了。</span><span lang="EN-US"></span></div>
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-91131852576173544082013-05-13T13:58:00.000+08:002013-05-21T11:19:41.091+08:00C中指针的复杂用法及阅读技巧<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">在说明复杂指针定义之前,我们先补习一下基本的指针定义形式。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">普通指针</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">定义:</span><span lang="EN-US">int *p;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这个是定义一个指向</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">类型数据的指针。但是这样不容易理解,我自己的理解方式如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">其实,</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是一个</span><span lang="EN-US">32</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位的数字(</span><span lang="EN-US">64</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位系统为</span><span lang="EN-US">64</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位,这里以</span><span lang="EN-US">32</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位),只不过这个数字具体的意思是个内存地址,所以不能进行数学意义上的加减乘除(地址的加减乘除,是以类型大小</span><span lang="EN-US">sizeof(int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">为单位的)。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">如果我们直接使用</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,则是一串数字地址,如果我们想要</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">地址处的数据,就需要加一个</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">因此,</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">诞生了,意思是我要拿出地址</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">处的数据。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">因此,</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是一个单独的变量,里面存储的是地址。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">因此,我们视觉上,可以这样写:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int* p;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">即代表</span><span lang="EN-US">int*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">类型的变量</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">使用:</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">既然</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是个单独的变量,那么直接使用</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,就是在操作地址。为了操作</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">地址处的值,我们使用</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,这时候,</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">作为一个整体,含义就与变量一样了。我们直接认为它是个普通的变量即可。修改</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">地址处的值:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">*p = 1;<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">数组指针与指针数组</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">数组指针是一个指向数组的指针,指针数组是一个存储指针的数组。这仍然是个抽象的定义,我们来看看例子。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">指针数组:</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int *p[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">根据上文提示的,我们可以先转为</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int* p[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">格式,这样我们就很好理解了,这是一个存储</span><span lang="EN-US">int*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">类型的数组。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">数组指针:</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*p)[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">根据上文理解,由于</span><span lang="EN-US">(*p)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">带了括号,说明强制</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">为一个整体,而</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">作为一个整体,可以认为是个普通变量,那我们转换一下,将</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">修改为</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int a[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这样就好理解了,</span><span lang="EN-US">*p=a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,由于</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">就是个地址,所以,其实</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">里保存的仍然是地址。那么,</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">就是个指向有十个</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">元素数组。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这还有一点,“</span><span lang="EN-US">int (*p)[10];</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”仅仅是定义了一个指针,</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">仅占</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">个字节。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">因此,</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">必须初始化才能用,比如:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*p)[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int a[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">p = &a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这样</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">初始化后才可以用,否则</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是个随机数。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">扩展</span><span lang="EN-US" style="color: red;">1</span><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这里有一个问题,</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">其实是个地址,那能不能直接:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">p = a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">如果这样写,</span><span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">会有警告,类型不匹配。这其实涉及到普通数组的实质。</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">确实存储了一个地址,但</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的类型却不是指针(在这里</span><span lang="EN-US">sizeof(a) = 12</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">而不是</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">),这就类似于:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">long i = 4;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int j = 4;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">i</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">和</span><span lang="EN-US">j</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">存储的都为</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,但</span><span lang="EN-US">i</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">和</span><span lang="EN-US">j</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是不同的类型。</span><span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">编译时,就会警告类型不匹配。因此,</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">与</span><span lang="EN-US">&a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的类型是不一样的(在这里</span><span lang="EN-US">sizeof(a) = 12, sizeof(&a) =
4</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">)。但他们存储了相同的内容。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">扩展</span><span lang="EN-US" style="color: red;">2</span><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我再附上上面的例子:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*p)[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int a[10];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">p = &a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">然后,“</span><span lang="EN-US">*p[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”与“</span><span lang="EN-US">(*p)[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”一样吗?这里涉及到</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的优先级,其实</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的优先级很低,不如“</span><span lang="EN-US">[]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,因此,</span><span lang="EN-US">*p[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">实际为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">*(p[1])<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">那么,</span><span lang="EN-US">p[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是个什么东东呢?写程序验证一下会发现,</span><span lang="EN-US">p[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">代表了另一个跟</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">一样结构的数组,这个数组紧跟在数组</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">之后,由于我们没有定义这个数组,因此,在</span><span lang="EN-US">p[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这个数组中全部是乱码。从内存的角度来说,如果</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">地址为</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">数组大小为</span><span lang="EN-US">12</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">字节,那么</span><span lang="EN-US">p[1]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">代表地址</span><span lang="EN-US">12</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,</span><span lang="EN-US">p[2]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">代表地址</span><span lang="EN-US">24</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。这样做有什么意义呢?在二维数组中很有意义,在二维数组中,</span><span lang="EN-US">p[N]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">代表第</span><span lang="EN-US">N</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">行的首地址。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">扩展</span><span lang="EN-US" style="color: red;">3</span><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">看以下代码正确吗?</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include <stdio.h><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int main() <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">{ <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> int a=3, b = 5;<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> printf(&a["Ya!Hello!
how is this? %s\n"], &b["junk/super"]);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf(&a["WHAT%c%c%c
%c%c %c !\n"], 1["this"],<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> 2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return 0; <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这段代码是正确的,输出如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">Hello! how is this? super<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">That is C !<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">为什么呢?本例主要展示了一种另类的用法。下面的两种用法是相同的:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">"hello"[2]<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2["hello"]<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">如果你知道:</span><span lang="EN-US">a[i] </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">其实就是</span><span lang="EN-US">
*(a+i)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">也就是</span><span lang="EN-US"> *(i+a)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,所以如果写成</span><span lang="EN-US">
i[a] </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">应该也不难理解了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数指针</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数指针在感官上比较复杂,但实际上仍然是有规律的。首先我们要明白,函数名的本质是个指针常量,是的,你没看错,它和数组名是一样的道理。比如</span><span lang="EN-US">sizeof(function) = 1</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,如果用</span><span lang="EN-US">printf</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">打印</span><span lang="EN-US">function</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,则是函数的入口地址。如果我们理解了数组指针,那我们同理可以推出函数指针。只不过函数指针在书写格式上有些特别,比如以下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*fun)();<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们仍然需要将</span><span lang="EN-US">*fun</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">用括号括起来,因为默认</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是与</span><span lang="EN-US">void</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">结合的,如果不用括号,则变成如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void* fun();<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">代表一个返回值为</span><span lang="EN-US">void*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的</span><span lang="EN-US">fun</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">函数。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">带参数的函数指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">先看例子,如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*fun)(int, int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">参数不需要名称,只需要指定类型即可。再来一个复杂点的:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*fun)(int, int (*)(int));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*)(int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是函数的一个参数,表示带一个</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">参数并且返回值为</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的函数指针。中间括号里只有一个</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">可能让大家不习惯,其实我们上面说过了,我们只需要指定类型,不需要名字,本来</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">后面是放一个名字的,这里去掉了,就变成了</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。当然,我们也可以画蛇添足,把名字加上:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*fun)(int a, int (*b)(int));<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">返回值为函数指针的函数指针</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">那这里有个问题,如果我们需要定义一个函数指针,该函数返回的是另一个函数的指针,该怎么定义呢?是这样吗:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(void (*)(int)) *fun(int, int)<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">放到</span><span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">里,发现编译错误。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">实际上,</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">采用了一种很难理解的方式来处理这种返回函数指针的情况,不过格式是固定的。在阐述“返回值为函数指针的函数指针”前,我们先讨论一下,如何定义一个<span style="color: red;">“返回值为函数指针的函数”</span>。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">根据上面的经验,以下函数定义明显不对了:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">(void (*)(int)) fun(int a, int b) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">...<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">那什么格式是正确的呢?我们需要将整个“</span><span lang="EN-US">fun(int a, int b)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”搬迁到“</span><span lang="EN-US">(void (*)(int))</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”。如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(void (*fun(int a, int b))(int))<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">做这样的修改后,我们不需要大括号了,去掉大括号:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*fun(int a, int b))(int)<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">因此,最终代码为:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">void (*fun(int a, int b))(int) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">...<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">很绕吧。但是</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">就是这么定义的,呵呵。有几个小细节,上面是</span><span lang="EN-US">*fun</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">而不能是</span><span lang="EN-US">(*fun)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,这个其实很好理解,我们以一个返回普通指针的例子做类比:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int* fun2(int c, int d) {}<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">“</span><span lang="EN-US">fun(int a, int b)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”是一个整体,对应于“</span><span lang="EN-US">fun2(int c, int d)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”。“</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”对应于上面的“</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,“</span><span lang="EN-US">void (*...)(int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”整体即为上面的“</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”。只不过由于“</span><span lang="EN-US">void (*...)(int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”这个类型把函数名给包起来了,所以看起来很绕。如果使用“</span><span lang="EN-US">(*fun)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”就把“</span><span lang="EN-US">fun(int a, int b)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”拆开了,没有任何意义。对比表:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<b><span lang="EN-US">int*
fun2(int c, int d) {}<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<b><span lang="EN-US">void
(*fun(int a, int b))(int) {}<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">int*<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">void (*...)(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">fun2(int c, int d)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">fun(int a, int b)<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">知道了“返回值为函数指针的函数”,那我们再来探讨“返回值为函数指针的函数指针”。我再将上文错误的写法写一遍:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(void (*)(int)) *fun(int, int)<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">对于“返回值为函数指针的函数指针”,我们也需要将右边“</span><span lang="EN-US">*fun(int, int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”整个放到左边“</span><span lang="EN-US">(void (*)(int))</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”中,如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(void (*(*fun)(int, int))(int))<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">做这样的修改后,我们不需要大括号了,去掉大括号:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span lang="EN-US">void
(*(*fun)(int, int))(int)<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">注意</span><span lang="EN-US" style="color: red;">1</span><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">右边“</span><span lang="EN-US">*fun(int, int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”中的“</span><span lang="EN-US">*fun</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”我们加了括号,这主要是优先级问题,</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">优先级比较低,如果不加括号,默认含义为“</span><span lang="EN-US">*(fun(int, int))</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,引起错误。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">注意</span><span lang="EN-US" style="color: red;">2</span><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">:</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">上面的写法其实还是可以与普通的指针做类比的,例如:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int * p;<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">“</span><span lang="EN-US">*fun(int, int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”是一个整体定义,对应于</span><span lang="EN-US">*p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">“</span><span lang="EN-US">void (*...)(int)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”是一个整体类型,对应于上面的类型</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。如下表:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<b><span lang="EN-US">int
* p;<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<b><span lang="EN-US">void
(*(*fun)(int, int))(int);<span style="color: red;"><o:p></o:p></span></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">int<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">void (*...)(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">*p<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 207.4pt;" valign="top" width="277">
<div class="MsoNormal">
<span lang="EN-US">(*fun)(int, int)<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">更复杂的函数指针</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">直接上个例子:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*(*fun2_p2)(int, void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">此类定义已经快逆天了(对的,是“快”,还没到,坚持住啊),不过我们按照前面的方法,还是比较容易理解的。首先看到这个结构,这肯定是个被“函数指针返回值”包裹的指针,因此,我们先按照普通指针的结构进行剥离:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.35pt;" valign="top" width="170">
<div class="MsoNormal">
<b><span lang="EN-US">int
* p;<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 287.45pt;" valign="top" width="383">
<div class="MsoNormal">
<b><span lang="EN-US">void
(*(*fun2_p2)(int, void(*)(int)))(int);<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.35pt;" valign="top" width="170">
<div class="MsoNormal">
<span lang="EN-US">int<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 287.45pt;" valign="top" width="383">
<div class="MsoNormal">
<span lang="EN-US">void (*...)(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 127.35pt;" valign="top" width="170">
<div class="MsoNormal">
<span lang="EN-US">*p<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 287.45pt;" valign="top" width="383">
<div class="MsoNormal">
<span lang="EN-US">(*fun2_p2)(int, void(*)(int))<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">可以看出,这是一个名字叫</span><span lang="EN-US">fun2_p2</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的函数指针,指向一个函数,这个函数返回一个函数指针,并且参数里也有一个函数指针。这个函数的定义是:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">void (*fun2(int a, void(*b)(int)))(int) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">...<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们把这个函数定义拆一下:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 148.6pt;" valign="top" width="198">
<div class="MsoNormal">
<b><span lang="EN-US">int*
fun(int a, int b)<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 266.2pt;" valign="top" width="355">
<div class="MsoNormal">
<b><span lang="EN-US">void
(*fun2(int a, void(*b)(int)))(int)<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 148.6pt;" valign="top" width="198">
<div class="MsoNormal">
<span lang="EN-US">int*<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 266.2pt;" valign="top" width="355">
<div class="MsoNormal">
<span lang="EN-US">void (*...)(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 148.6pt;" valign="top" width="198">
<div class="MsoNormal">
<span lang="EN-US">fun(int a, int b)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 266.2pt;" valign="top" width="355">
<div class="MsoNormal">
<span lang="EN-US">fun2(int a, void(*b)(int))<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">逆天前的准备:存储((返回值为函数指针的函数)的指针)的数组</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">还能坚持住不?先解释一下标题吧……</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这是一个数组;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这数组存储指针;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这些指针指向函数;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这些函数的返回值是函数指针。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">上例子:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*(*fun_p[4])(int,
void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们以返回</span><span lang="EN-US">int</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">型指针的函数的指针数组做类比:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<b><span lang="EN-US">int*
(*p[4])()<o:p></o:p></span></b></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<b><span lang="EN-US">void
(*(*fun_p[4])(int, void(*)(int)))(int)<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">int*<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">void (*...)(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">*p[4]<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">*fun_p[4]<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">()<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">(int, void(*)(int))<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">逆天!指向(存储((返回值为函数指针的函数)的指针)的数组)的指针</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">好吧,你到这了,我就不卖关子了,关门放狗:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*(*(*fun_arr_p)[10])(int,
void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们不得不再解释一下标题先:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这是一个名为</span><span lang="EN-US">fun_arr_p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的指针;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">它指向一个数组;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这数组存储指针;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这些指针指向函数;</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这些函数的返回值是函数指针。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是的,这个指针可以指向上面那个准备逆天的数组!我们先从最外面剥皮:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">1</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*(*(*fun_arr_p)[10])(int,
void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> =><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void(*...)(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">好熟悉的格式,显然是个函数指针类型的返回值。说明里面定义了一个函数指针。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">2</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(*(*fun_arr_p)[10])(int, void(*)(int))<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> =><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(*...[10])(int, void(*)(int))<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这显然是在定义一个函数指针数组。可以跟简单点的函数指针数组做类比:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*fun[10])();<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">其中</span><span lang="EN-US">(*...[10])();</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">就是上面的部分。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(*fun_arr_p)<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">有</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">号,这显然是个指针定义,说明不是在定义函数指针数组,而是定义指向函数指针数组的指针。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">乱了吧?实际上我在写上面内容的时候也纠结死了。我们再做一个类比吧,以下是一个普通的“指向函数指针数组的指针”:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int* (*(*p)[10])(); //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">写法:先写一个指针数组</span><span lang="EN-US">int* p[10]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,然后我们将</span><span lang="EN-US">p</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">改为指针</span><span lang="EN-US">int* (*p)[10]</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,这样就变成指向指针数组的指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">他只有四个字节,类比表:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">int* (*(*p)[10])()<o:p></o:p></span></div>
</td>
<td style="border-left: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">void (*(*(*fun_arr_p)[10])(int,
void(*)(int)))(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">int*<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">void (*...)(int)<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">(*...[10])()<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">(*...[10])(int, void(*)(int))<o:p></o:p></span></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 106.1pt;" valign="top" width="141">
<div class="MsoNormal">
<span lang="EN-US">(*p)<o:p></o:p></span></div>
</td>
<td style="border-bottom: solid windowtext 1.0pt; border-left: none; border-right: solid windowtext 1.0pt; border-top: none; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 308.7pt;" valign="top" width="412">
<div class="MsoNormal">
<span lang="EN-US">(*fun_arr_p)<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我花了两天才写到这里……不过我现在又晕了……</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们梳理一下:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">普通的函数指针是这样的:</span><span lang="EN-US">void (*p)(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">普通的函数指针数组是这样的:</span><span lang="EN-US">void (*p[10])(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">普通的指向函数指针数组的指针是这样的:</span><span lang="EN-US">void (*(*p)[10])(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">如果函数的返回值是函数指针类型</span><span lang="EN-US">int(*)()</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,那上面的指针是这样的:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int(*(*(*p)[10])(int))();<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">好吧,我只能写到这了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span lang="EN-US" style="color: red;">C</span></b><b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中对于逆天函数及函数指针的折中解决方法</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">如果</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中全部是这种逆天的定义,那代码就直接没办法看了。后来</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">标准中出现了</span><span lang="EN-US">typedef</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,用来解决这种超复杂定义的问题。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">typedef</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的作用是给类型定义别名,因此,我们可以把复杂的类型用简单的方式定义。例如:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">对于函数:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*fun2(int a, void(*b)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们将其返回值类型定义一个别名:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span lang="EN-US">typedef
void (*HANDLER)(int);<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这样,函数就可以定义为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">HANDLER fun2(int a, HANDLER b);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">看,这样就简洁多了,而且看起来比较符合普通函数的定义。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">对于函数指针:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*(*fun2_p2)(int, void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">我们可以写为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">HANDLER (*fun2_p2)(int, HANDLER);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是不是简单了许多呢?注意哦,</span><span lang="EN-US">*fun2_p2</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的括号仍然不能去,优先级问题,不加括号会被理解为“</span><span lang="EN-US">*(fun2_p2(int, HANDLER))</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,前面已经解释过了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">下面分析一下逆天的指针:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*(*(*fun_arr_p)[10])(int,
void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">结果:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">HANDLER (*(*fun_arr_p)[10])(int, HANDLER);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">强制转换为函数指针</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US">(void (*)(int))fun</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,这是强制类型转换的效果。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">几个例子</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span lang="EN-US">1</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">(*(void(*)())0)();<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">首先,我们先判断最外面,显然是两个括号“</span><span lang="EN-US">()()</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,这说明这句话应该是在调用某个无参函数。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">然后我们分析“</span><span lang="EN-US">*(void(*)())0</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,由于</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的优先级比较低,所以代码可以理解为:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">*((void(*)())0)<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">也就是“</span><span lang="EN-US">*(...)</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”的形式,这说明,整句代码是在用某个函数指针调用函数。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">第三步,就是“</span><span lang="EN-US">(void(*)())0</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”了,这个很好理解了,将地址</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">强制转换为“</span><span lang="EN-US">(void(*)())</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”型指针。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">最后,整句代码的意思就是调用地址</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">处的无参函数。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">2</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">、</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int *a; //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int **a; //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">指向指针的指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int a[10]; //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">数组</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int *a[10]; //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">存储指针的数组</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*a)[10]; //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">指向数组的指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*a)(int); //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">指向函数的指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*a[10])(int); //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">存储指向函数的指针的数组</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int (*(*a)[10])(int); //</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">指向上面数组的指针</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: red; font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">一段验证代码</span><span lang="EN-US" style="color: red;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">上面说到的大部分内容的测试代码,可以很方便的验证结论。</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 414.8pt;" valign="top" width="553">
<div class="MsoNormal">
<span lang="EN-US">#include<stdio.h><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">typedef void (*HANDLER)(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void fun(int a) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("Hi,
I'm fun! a = %d\n", a);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">int* fun0(int* a) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return
a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">//(void (*)(int)) (fun)(int a, int b) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">void (*fun1(int a, int b))(int) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("fun1
invoked. a = %d, b = %d\n", a, b);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return
fun;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">void (*fun2(int a, void(*b)(int)))(int) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("fun2
invoked. a = %d, I will invoke your function and return the function\n",
a); <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*b)(a);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return
b;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">int main() {<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> int
a[3] = {1, 2, 3};<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> int
(*b);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> int
(*p)[3];<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("p
= %p, sizeof(p) = %d, sizeof(a) = %d\n", p, sizeof(p), sizeof(a));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> p
= a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("p
= a\n");<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("&p
= %p, p = %p, a = %p\n", &p, p, a);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("p[0]
= %p, *p[0] = %p, p[1] = %p, *p[1] = %d, sizeof(p[1]) = %d, (*p)[1] =
%d\n", p[0], *p[0], p[1], *p[1], sizeof(p[1]), (*p)[1]);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("**p
= %d, *p = %p\n", **p, *p);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> p
= &a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("p
= &a\n");<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("&p
= %p, p = %p, a = %p\n", &p, p, a);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("p[0]
= %p, *p[0] = %p, p[1] = %p, *p[1] = %d, sizeof(p[1]) = %d, (*p)[1] =
%d\n", p[0], *p[0], p[1], *p[1], sizeof(p[1]), (*p)[1]);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("**p
= %d, *p = %p, *a = %d\n", **p, *p, *a);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> int
i = a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("i
= a, i = %d, sizeof(a) = %d\n", i, sizeof(a));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> i
= &a;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("i
= &a, i = %d, sizeof(&a) = %d\n", i, sizeof(&a));<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("sizeof(fun)
= %d, fun addr = %p\n", sizeof(fun), fun);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*fun_p)(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun_p
= &fun;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*fun_p)(1);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> int*
(*fun0_p)(int*);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun0_p
= &fun0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> i
= 0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("fun0:
I'm return int point. a = %d\n", *(*fun0_p)(&i));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*(*fun1_p1)(int, int))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun1_p1
= &fun1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun_p
= (*fun1_p1)(2, 3);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*fun_p)(4); <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*(*fun2_p2)(int, void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun2_p2
= &fun2;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*fun2_p2)(5,
fun)(6);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> HANDLER
(*fun1_p3)(int, int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun1_p3
= &fun1;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun_p
= (*fun1_p3)(7, 8);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> HANDLER
(*fun2_p4)(int, HANDLER);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun2_p4
= &fun2;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*fun2_p4)(9,
fun)(10);<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*(*fun2_arr[4])(int, void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> for
(i = 0; i < sizeof(fun2_arr) / sizeof(fun2_arr[0]); i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun2_arr[i]
= &fun2;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun2_arr[i](i,
fun)(i);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*(*(*fun2_arr_p)[4])(int, void(*)(int)))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun2_arr_p
= &fun2_arr;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> for
(i = 0; i < sizeof(*(fun2_arr_p)) / sizeof((*fun2_arr_p)[0]); i++) {<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*fun2_arr_p)[i]
= &fun2;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> (*fun2_arr_p)[i](i,
fun)(i);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> }<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*fun_arr[10])(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> void
(*(*fun_arr_p)[10])(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> fun_arr_p
= &fun_arr;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> int(*(*(*fun_arr_p1)[10])(int))();<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> //int
(*fun_p2)(int a, int (*b)(int));<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> //void
(*fun(int, int))(int);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> <o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return
0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">再专业一些的内容可以参见《</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">陷阱与缺陷》这本书,讲的很好。</span><span lang="EN-US"><o:p></o:p></span></div>
<br />Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-80020986768822872662013-05-03T10:35:00.001+08:002013-05-03T10:35:42.893+08:00如何查找物理磁盘编号——解决VMWARE挂载物理磁盘时出现的编号变化的问题<br />
VMware挂载物理磁盘时,使用PhysicalDriveX的方式标记物理磁盘。不过,这个编号很容易变化,比如你挂载的是一块移动硬盘的某个分区,或者虚拟机复制到了其它机器上。由于只是编号的变化,我们只需要修改一下编号,就可以让虚拟机找到正确的磁盘。<br />
<br />
首先,我们需要确定新的编号是多少。在命令提示符输入以下命令:<br />
wmic diskdrive list<br />
上面命令可能显示的内容太多,可以输入以下命令精简一下内容:<br />
wmic diskdrive list brief<br />
根据驱动器的名称,我们很容易找到物理磁盘编号。比如我的是:<br />
C:\Users\Virtuoustao>wmic diskdrive list brief<br />
Caption DeviceID Model Partitions Size<br />
ST950042 3AS USB Device \\.\PHYSICALDRIVE1 ST950042 3AS USB Device 2 500105249280<br />
SSK HE-T300 USB Device \\.\PHYSICALDRIVE2 SSK HE-T300 USB Device 3 500105249280<br />
INTEL SSDSA1M080G2HP \\.\PHYSICALDRIVE0 INTEL SSDSA1M080G2HP 2 80023265280<br />
找到了SSK的移动硬盘编号是PHYSICALDRIVE2。<br />
<br />
然后,我们需要修改VMware的配置文件。到虚拟机根目录下,可以看到有好多vmdk后缀的文件,这些就是对虚拟机磁盘的描述。命名方式一般是“<虚拟机名>-<编号>.vmdk”。我们如何确定哪个是我们的物理磁盘配置文件呢?很简单,去“VM→Settings...→Hardware”,在列表里找到你的磁盘,Disk file就是相应磁盘的配置文件。我的是“Ubuntu 64-bit-1.vmdk”。<br />
<br />
用UltraEdit或者其它高级文本编辑器打开Ubuntu 64-bit-1.vmdk(此文件用的是Linux换行符,因此最好不要用Windows自带的文本编辑器),会有一行类似以下的内容:<br />
RW 587223882 FLAT "\\.\PhysicalDrive4" 389544183 partitionUUID \\?\usbstor#disk&ven_ssk&prod_he-t300&rev_9072#0000000000000052&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}<br />
<br />
将PhysicalDrive4改为PhysicalDrive2即可。<br />
<br />
最后,保存退出编辑,用VMware打开虚拟机,即可正常运行。<br />
<br />
注意,这个只能解决同一个物理磁盘编号改变的问题,无法解决磁盘迁移的问题(即你想以当前的配置文件挂载新的物理磁盘)。<br />
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-83346802406943215612013-04-26T10:19:00.000+08:002013-04-26T10:19:16.539+08:00解决Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题PyQt4在Windows中使用了DirectX作为加速,不过,PyQt4没有使用最新的DirectX库(应该是使用的DirectX9)。在最新的Windows 8中,并不包括这些旧版本的DirectX,这就导致了PyQt4工作不正常,并对Eric5的安装造成影响。<br />
<br />
安装Eric5时,会碰到以下错误提示:<br />
<br />
Checking dependencies<br />
Python Version: 3.3.1<br />
Found PyQt4<br />
Sorry, please install QtHelp.<br />
Error: DLL load failed: 找不到指定的模块。<br />
Press enter to continue...<br />
<br />
这是因为缺少DirectX库导致了这个问题。解决方法:<br />
去微软的官方网站下载DirectX在线安装程序:<br />
http://www.microsoft.com/zh-cn/download/details.aspx?id=35<br />
然后根据提示安装DirectX库即可(可以看到安装的库大部分是2006~2008年的)。Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-43577879387956724722013-04-23T11:56:00.002+08:002013-04-23T11:56:38.981+08:00解决Cygwin下使用https缺乏证书的问题(比如git)<br />
Cygwin下默认没有证书包,因此使用https会出现以下错误:<br />
error: error setting certificate verify locations<br />
即没有找到相应的根证书位置。解决方法很简单:<br />
运行Cygwin的安装程序setup.exe安装ca-certificates包即可解决。<br />
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-22339520371107048082013-04-23T10:44:00.001+08:002013-04-23T10:44:56.577+08:00CMD命令提示符恢复默认代码页936<br />
用一些命令行程序,默认代码页可能会被修改,可能导致不能显示中文、光标错位等奇怪问题。改回来的方法(永久修改参见修改注册表那部分):<br />
<br />
临时修改方法,命令行输入:<br />
chcp 936<br />
<br />
其它一些语言:<br />
rem 英文<br />
chcp 437<br />
<br />
rem 日文<br />
chcp 932<br />
<br />
rem 简体中文<br />
chcp 936<br />
<br />
rem 韩文<br />
chcp 949<br />
<br />
rem 繁体中文<br />
chcp 950<br />
<br />
rem utf-8<br />
chcp 65001<br />
<br />
如果想将代码页作为默认,需要修改注册表:<br />
<br />
1 win键+R打开“运行”对话框,输入regedit打开注册表编辑器。<br />
<br />
2 找到 [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]<br />
<br />
3 修改"CodePage"=dword:000003a8<br />
<br />
【注】十六进制"000003a8"或十进制"936",表示“936 (ANSI/OEM - 简体中文 GBK)”。<br />
<br />
如果代码页改成65001之后,仍无法正常显示UTF-8字符,则需要改变字体属性:在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console",然后点击确定将属性应用到当前窗口。<br />
通过以上操作并不能完全解决问题,因为显示出来的内容有可能不完全。可以先最小化,然后最大化命令行窗口,文件的内容就完整的显示出来了。<br />
<br />
----------------------------------------------------------------------------------------------------------------<br />
<br />
<br />
附: chcp详解<br />
<br />
功能说明<br />
显示活动控制台代码页数量,或更改该控制台的活动控制台代码页。如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量。<br />
<br />
补充说明<br />
只有随 XOX 一起安装的原始设备制造商 (OEM) 代码页才能在使用 Raster 字体的命令提示符窗口中正常显示。其他代码页则可在全屏幕模式下或者在使用 TrueType 字体的命令提示符窗口中正确显示。 就像在 MS-DOS 中一样,您不必准备代码页。 在指派了新代码页之后启动的程序将使用该新代码页,但如果程序(除了 Cmd.exe)是在指派新代码页之前启动的,那么该程序将使用原来的代码页。<br />
<br />
语法<br />
chcp [NNN]<br />
<br />
参数<br />
NNN 指定代码页。下表列出了MSDOS所有支持的代码页及其国家(地区)或者语言:<br />
代码页 国家(地区)或语言<br />
437 美国<br />
850 多语言(拉丁文 I)<br />
852 斯拉夫语(拉丁文 II)<br />
855 西里尔文(俄语)<br />
857 土耳其语<br />
860 葡萄牙语<br />
861 冰岛语<br />
863 加拿大 - 法语<br />
865 日耳曼语<br />
866 俄语<br />
869 现代希腊语<br />
936 简体中文<br />
950 繁体中文<br />
65001 UTF-8<br />
<br />
/? 在命令提示符下显示帮助。<br />
<br />
示例<br />
要查看活动代码页设置,请键入:<br />
chcp<br />
出现类似于下面内容的消息:<br />
活动代码页:437<br />
<br />
如果要将活动代码页更改为 850(多语言),请键入:<br />
chcp 850<br />
如果指定的代码页无效,则会显示以下错误消息:<br />
<br />
无效代码页<br />
<br />
参考文章:http://m.oschina.net/blog/108542<br />
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-39020195298395032812013-04-22T11:45:00.001+08:002013-04-22T11:45:48.073+08:00C语言中关于char是否为有符号的问题<br />
<div class="MsoNormal">
<span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中</span><span lang="EN-US">char</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">默认是有符号数,但是“</span><span lang="EN-US">char a = 255;</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”是正确的,</span><span lang="EN-US">a</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">会自动保存为</span><span lang="EN-US">-1</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。如下代码:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 426.1pt;" valign="top" width="568"><div class="MsoNormal">
<span lang="EN-US">char ch = 255;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">printf("ch = %d\n", ch);<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">结果为</span><span lang="EN-US">-1</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">那么,这里有这么一个现象:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 426.1pt;" valign="top" width="568"><div class="MsoNormal">
<span lang="EN-US">char ch = 255;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">ch -= 128;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">printf("ch = %d\n", ch);<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">得到的结果为“</span><span lang="EN-US">ch = 127</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">”,这并不是因为</span><span lang="EN-US">255
- 128 = 127</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,而是</span><span lang="EN-US">-1 - 128 = 127</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。因为</span><span lang="EN-US">char</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是单字节的,</span><span lang="EN-US">-1 - 128</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是不够减的,由于存储空间只有</span><span lang="EN-US">8</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位,第九位无法表示符号,所以被舍弃,丢了符号位的数字转换为二进制成为了</span><span lang="EN-US">127</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这里举个简单点的例子:</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">-128</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的</span><span lang="EN-US">8</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位二进制为</span><span lang="EN-US">1000 0000<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">-128 - 1 </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">得到的</span><span lang="EN-US">8</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位二进制为</span>
<span lang="EN-US">0111 1111 </span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">(</span><span lang="EN-US">DEC:127</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">)</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">这是因为,</span><span lang="EN-US">8</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">位二进制无法表示</span><span lang="EN-US">-129</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,舍弃第九位后,就变为</span><span lang="EN-US">127</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">了。</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">如何查看自己的</span><span lang="EN-US">gcc</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">对</span><span lang="EN-US">char</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的处理呢?方法如下:</span><span lang="EN-US"><o:p></o:p></span></div>
<table border="1" cellpadding="0" cellspacing="0" class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 426.1pt;" valign="top" width="568"><div class="MsoNormal">
<span lang="EN-US">#include <limits.h><o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">int main()<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">{<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> printf("CHAR_MIN
= %d\n", CHAR_MIN);<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US"> return
0;<o:p></o:p></span></div>
<div class="MsoNormal">
<span lang="EN-US">}<o:p></o:p></span></div>
</td>
</tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">在</span><span lang="EN-US">limits.h</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">中定义了</span><span lang="EN-US">char</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">的最小值</span><span lang="EN-US">CHAR_MIN</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,如果</span><span lang="EN-US">CHAR_MIN = -128</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,则</span><span lang="EN-US">char</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是有符号数,如果</span><span lang="EN-US">CHAR_MIN = 0</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">,则</span><span lang="EN-US">char</span><span style="font-family: 宋体; mso-ascii-font-family: Consolas; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas;">是无符号数。</span><span lang="EN-US"><o:p></o:p></span></div>
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-24262259619913482392013-04-22T11:41:00.001+08:002013-04-22T11:41:08.583+08:00解决Cygwin下vi和vim的复制粘贴问题vi(vim)修改了默认的鼠标行为,这样导致我们无法调出右键菜单复制文本。解决方法很简单,按住shift键屏蔽vi(vim)对鼠标的控制,然后用鼠标复制代码即可。Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-22623825462101287112013-04-22T09:49:00.002+08:002013-04-22T09:49:47.846+08:00解决Cygwin下vi和vim方向键和Backspace不好用的问题<br />
默认的vi(vim)没有配置文件,因此导致了方向键出现ABCD,以及Backspace只会移动光标,字符不消失的问题。cygwin自带vi(vim)配置文件的例子,直接拷贝即可,参考以下命令:<br />
$ cd /usr/share/vim/vim73<br />
$ cp vimrc_example.vim ~/.vimrc<br />
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0tag:blogger.com,1999:blog-1690246088148516119.post-87932232905373397252013-04-14T02:03:00.000+08:002013-04-16T00:08:16.990+08:00QQ一代死保上二代保护和申诉心得<br />
网上有好多的心得,我这里只说一下我的经验,可能与网上有出入。另外,不排除腾讯以后会修改策略,这里仅以这篇文章发布的时间为准。<br />
我有两个一代死保号,仅知道2个历史密码和当前密码。根据我的观察,腾讯的策略并没有那么复杂,关键在于IP地址是否经常变化。如果能保证IP地址不变(一个数字都不变),大概挂3~4天就能改密码(网上说的7天大概是因为IP地址后两位有变化),2个月就能上保。下面我详细说明下我是怎么做的。<br />
先解释一下IP地址的重要性。IP地址用于身份识别,理论上每个上网的人必须分配一个唯一的IP地址(类似于门牌号码),这样别人才能找到你并与你通信(PS:警察叔叔可以随便就能找到你,网络并不是完全匿名的)。根据运营商的策略,每个地区会有很多固定的IP地址段,将IP地址段与位置联系起来,就能大概知道上网者的位置。这也是为什么网上的天气预报能自动判断你所在的城市,而跟贴评论的时候,有些网站也会显示你是XX地区的网友。当然,IP地址的位置不一定绝对正确,但准确率是相当高的。<br />
根据以上的原理,腾讯作为一款网络工具,最直接的方式是通过IP地址来判断你是否真的是你(腾讯不能查你的身份证,也不能通过密码来确定,因为你的密码可能会被盗)。因此,如果你一直在用某个固定的IP登录QQ,那腾讯基本上就确定你是同一个人。如果你经常用北京的IP:1.2.3.4(此地址为虚构)地址登录QQ,突然用上海的IP:2.3.4.5地址登录QQ,会发现有验证码。并且聊天的时候,你的朋友会被提醒,你是在不常用的地点登录的。这是因为腾讯感觉有问题,你可能不是真正的你。<br />
上面说了,理论上一人一个IP地址,但实际上,由于IP地址资源比较少,存在很多人共享一个IP地址上网的情况,比如:网吧、办公室、手机2G/3G网络等等。还存在IP地址经常变化的情况,比如网上经常说的宽带拨号用户。这时候腾讯就不能判断你是否是同一个人了。因此,在这种情况下,上保和申诉都是非常困难的(甚至挂很长时间密码都改不了),并且时间长度也不一样(但肯定超过2个月)。<br />
当然,腾讯还有其它辅助手段,来判断是否允许你上保和申诉成功。比如:是否是同一个系统、提供的资料是否完整准确、是否有争议(好多人在申诉)。<br />
下面说一下我的过程。我采用的是最优的方式,即固定IP,固定系统,号码没有争议:我弄了一台Windows服务器(可7×24小时运行),带独立IP地址,因此IP地址可以保证完全一样。系统也可以保证同一个。号码从比较可靠的人那里得到的,没有别人申诉。<br />
刚开始挂上,不要立即申诉,而是马上删除所有不相关的好友,添加3个以上的可以帮忙申诉的好友。这几个好友不要在同一个IP地址下。好多人喜欢将自己的小号作为帮助申诉的好友,并且这几个小号天天挂在同一台电脑上,这样容易申诉失败。<br />
耐心的挂3~4天,期间重新登录一两次。然后打开修改密码的页面,会发现可以修改密码了。修改密码后,记下原来的密码,这样就有一个历史密码了。如果你的历史密码没有凑够3个,则每隔十天换一次密码,以凑够历史密码。有时候,挂的时间长了(3天以上没下过线),会发现密码仍然不能改,这时候重新登录一下就可以改了。<br />
注意,对于价值比较高的号码,经常会收到类似:“您的号码即将冻结”、“您的号码有异常”等等的电子邮件,这类邮件是典型的钓鱼邮件,专门盗你号的,千万不要上当。判断方法很简单,看看发件地址是不是腾讯的就可以了(腾讯官方地址:service@tencent.com),另外QQ邮箱也会有提示,标明此邮件非腾讯官方邮件(腾讯的官方邮件都是蓝色标题)。<br />
凑够历史密码以后,剩下的就是等待了。计算好时间,挂两个月。期间有时间就重新登录一下QQ,并和几个好友寒暄几句,这样是为了刷登录和通话记录。最好开通会员(我用手机绑定的)和财付通(我绑定了银行卡并做了实名),并充上点钱。QQ资料填写成你的,姓名、生日、电话等敏感信息,要填写准确,你可以设置成仅自己查看,这样防止别人知道你的真实信息。<br />
两个月后,我尝试着把其中一个号拿去安全中心上二代保护(下午5点左右发起的),我只填写了我的真实姓名和三个历史密码,等待四个小时后,提示我证据不足,失败了。于是我发起申诉,填写了我的姓名、身份证号、历史密码,并发起了三个好友辅助(如果这三个号都是你的,注意完成辅助的速度不要太快,要隔上个10分钟完成一个辅助;三个号码的常用登录地址不要一样),由于已是凌晨,我先睡觉了。第二天,我惊喜的收到了申诉成功的邮件。<br />
我第二个号码挂了接近3个月,直接上保成功。上保成功后,我又接着申诉,结果申诉也成功了。<br />
网上有教程说,上保/申诉的时间很重要,一般是凌晨、中午。我个人感觉不太靠谱,因为上保/申诉基本上都是机器自动判定的,很少有人工介入。<br />
Virtuoustaohttp://www.blogger.com/profile/08681758727853779808noreply@blogger.com0