﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-我的编程乐园-随笔分类-C++</title><link>http://www.cppblog.com/deercoder/category/13117.html</link><description>&lt;P&gt;&lt;FONT style="FONT-SIZE: 20px" color=#ff0000&gt;积累，坚持！&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="FONT-SIZE: 20px" color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------我是一只IT小小鸟&lt;/FONT&gt;&lt;/P&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 12 Jun 2011 13:03:50 GMT</lastBuildDate><pubDate>Sun, 12 Jun 2011 13:03:50 GMT</pubDate><ttl>60</ttl><item><title>【转载】指针参数是如何传递内存的？</title><link>http://www.cppblog.com/deercoder/archive/2011/05/28/147469.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sat, 28 May 2011 04:19:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2011/05/28/147469.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/147469.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2011/05/28/147469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/147469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/147469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  如果函数的参数是一个指针，不要指望用该指针去申请动态内存。示例7-4-1中，Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存，str依旧是NULL，为什么？<br> <br>void GetMemory(char *p, int num)<br>{<br>    p = (char *)malloc(sizeof(char) * num);<br>}<br>void Test(void)<br>{<br>    char *str = NULL;<br>    GetMemory(str, 100);    // str 仍然为 NULL <br>    strcpy(str, "hello");   // 运行错误<br>}<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/deercoder/archive/2011/05/28/147469.html'>阅读全文</a><img src ="http://www.cppblog.com/deercoder/aggbug/147469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2011-05-28 12:19 <a href="http://www.cppblog.com/deercoder/archive/2011/05/28/147469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【内存对齐（二）】__declspec( align(#) )的用法和大小计算</title><link>http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sun, 13 Mar 2011 14:30:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/141747.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/141747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/141747.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html'>阅读全文</a><img src ="http://www.cppblog.com/deercoder/aggbug/141747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2011-03-13 22:30 <a href="http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【内存对齐(一)】#pragma pack的用法及大小的计算</title><link>http://www.cppblog.com/deercoder/archive/2011/03/13/141717.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sun, 13 Mar 2011 06:09:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2011/03/13/141717.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/141717.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2011/03/13/141717.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/141717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/141717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/deercoder/archive/2011/03/13/141717.html'>阅读全文</a><img src ="http://www.cppblog.com/deercoder/aggbug/141717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2011-03-13 14:09 <a href="http://www.cppblog.com/deercoder/archive/2011/03/13/141717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言中可以求任意一个int型数组的长度吗？</title><link>http://www.cppblog.com/deercoder/archive/2011/03/01/140924.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Tue, 01 Mar 2011 09:14:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2011/03/01/140924.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/140924.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2011/03/01/140924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/140924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/140924.html</trackback:ping><description><![CDATA[近来在写程序的时候遇到了一个问题，就是传递一个数组指针进入一个函数的时候，虽然指针能够顺利的传递，但是，我们无法求出该数组的大小。见下面的代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setNum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setNum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_79_156_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_156_Open_Text.style.display='none'; Codehighlighter1_79_156_Closed_Image.style.display='inline'; Codehighlighter1_79_156_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_79_156_Closed_Image onclick="this.style.display='none'; Codehighlighter1_79_156_Closed_Text.style.display='none'; Codehighlighter1_79_156_Open_Image.style.display='inline'; Codehighlighter1_79_156_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_79_156_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_79_156_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_92_100_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_100_Open_Text.style.display='none'; Codehighlighter1_92_100_Closed_Image.style.display='inline'; Codehighlighter1_92_100_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_92_100_Closed_Image onclick="this.style.display='none'; Codehighlighter1_92_100_Closed_Text.style.display='none'; Codehighlighter1_92_100_Open_Image.style.display='inline'; Codehighlighter1_92_100_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_92_100_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_92_100_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(a)</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(a[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;setNum(a);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setNum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a)<br><img id=Codehighlighter1_185_196_Open_Image onclick="this.style.display='none'; Codehighlighter1_185_196_Open_Text.style.display='none'; Codehighlighter1_185_196_Closed_Image.style.display='inline'; Codehighlighter1_185_196_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_185_196_Closed_Image onclick="this.style.display='none'; Codehighlighter1_185_196_Closed_Text.style.display='none'; Codehighlighter1_185_196_Open_Image.style.display='inline'; Codehighlighter1_185_196_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_185_196_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_185_196_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setNum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p)<br><img id=Codehighlighter1_219_279_Open_Image onclick="this.style.display='none'; Codehighlighter1_219_279_Open_Text.style.display='none'; Codehighlighter1_219_279_Closed_Image.style.display='inline'; Codehighlighter1_219_279_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_219_279_Closed_Image onclick="this.style.display='none'; Codehighlighter1_219_279_Closed_Text.style.display='none'; Codehighlighter1_219_279_Open_Image.style.display='inline'; Codehighlighter1_219_279_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_219_279_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_219_279_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Num&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(p)</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(p[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,Num);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
结果是，输出分别是4和1.<br><br>原因分析：<br>1.对于第一个输出，由于在main函数中定义的为数组，所以可以直接利用sizeof函数来求出a数组的长度。<br>2.对于传递参数类型，比如上面的setNum函数（未传递个数版本），此时，调用该函数的时候，a退化为一个普通的指针，也就是说，此时sizeof(p)求出来的就是一个指针的大小，除以int的大小，恰好为1.<br><br>启示：<br>C语言中，不能够根据一个数组指针就求出来任意一个数组的大小。解决办法就是传第一个参数进来，指定大小。<br><br>ps：参考资料（详实）：<a href="http://topic.csdn.net/t/20060205/18/4540750.html"><u><font color=#000080>http://topic.csdn.net/t/20060205/18/4540750.html</font></u></a><br><br>摘录：<br><span style="TEXT-ALIGN: ; WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 23px; FONT-FAMILY: simsun; FONT-SIZE: 14px" class=Apple-style-span>&gt; &nbsp; 如果作为函数的参数是没法求的,<span class=Apple-converted-space>&nbsp;</span><br>&gt; &nbsp; 但这样是可以的:<span class=Apple-converted-space>&nbsp;</span><br>&gt; &nbsp;<span class=Apple-converted-space>&nbsp;</span><br>&gt; &nbsp; #define &nbsp; LENGTH(s) &nbsp; (sizeof(s) &nbsp; / &nbsp; sizeof(int))<span class=Apple-converted-space>&nbsp;</span><br>&gt; &nbsp;<span class=Apple-converted-space>&nbsp;</span><br>&gt; &nbsp; int &nbsp; s[12];<span class=Apple-converted-space>&nbsp;</span><br>&gt; &nbsp; int &nbsp; length &nbsp; = &nbsp; LENGTH(s);<span class=Apple-converted-space>&nbsp;</span><br>==================================================<span class=Apple-converted-space>&nbsp;</span><br>这样的方法只能用于数组变量的数组名，对于指向数组的指针，以及作为参数的数组名都是没有效果的，上面已经有人解释了<span class=Apple-converted-space>&nbsp;<br>》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》<br><span style="TEXT-ALIGN: ; WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 23px; FONT-FAMILY: simsun; FONT-SIZE: 14px" class=Apple-style-span>不可能有办法的。<span class=Apple-converted-space>&nbsp;</span><br>当你定义一个数组的时候：<span class=Apple-converted-space>&nbsp;</span><br>int &nbsp; a[] &nbsp; = &nbsp; {1, &nbsp; 2, &nbsp; 3}; &nbsp; &nbsp; // &nbsp; 实际上被编译为 &nbsp; int &nbsp; a[3] &nbsp; = &nbsp; {1，2，3}<span class=Apple-converted-space>&nbsp;</span><br><br>数组名代表的是数组的地址。注意 &nbsp; —— &nbsp; 你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候，你永远不可能知道他的长度。<span class=Apple-converted-space>&nbsp;</span><br><br>那么 &nbsp; sizeof &nbsp; 是怎么回事呢？他不是通过 &nbsp; a &nbsp; 的名字获得 &nbsp; a的大小了么？ &nbsp; —— &nbsp; 大错特错！<span class=Apple-converted-space>&nbsp;</span><br><br>关键字 &nbsp; sizeof &nbsp; 产生的是一个编译期常量（注1） &nbsp; 他的运作方式是这样的：<span class=Apple-converted-space>&nbsp;</span><br><br>当你写：<span class=Apple-converted-space>&nbsp;</span><br>sizeof &nbsp; a &nbsp;<span class=Apple-converted-space>&nbsp;</span><br>实质是:<span class=Apple-converted-space>&nbsp;</span><br>sizeof &nbsp; ( &nbsp; a的类型 &nbsp; )<span class=Apple-converted-space>&nbsp;</span><br><br>而a的类型是什么呢？编译器察看 &nbsp; a的定义发现， &nbsp; 是 &nbsp; int &nbsp; [3]<span class=Apple-converted-space>&nbsp;</span><br>就是说，这里 &nbsp; sizeof &nbsp; a &nbsp; 实质是：<span class=Apple-converted-space>&nbsp;</span><br>sizeof &nbsp; ( &nbsp; int[3] &nbsp; )<span class=Apple-converted-space>&nbsp;</span><br>完全等同于常量 &nbsp; 12 &nbsp; （假定int为4字节）。<span class=Apple-converted-space>&nbsp;</span><br><br><br>考虑一个函数<span class=Apple-converted-space>&nbsp;</span><br>void &nbsp; func( &nbsp; int &nbsp; a[] &nbsp; ); &nbsp; &nbsp;<span class=Apple-converted-space>&nbsp;</span><br>// &nbsp; 写成 &nbsp; int &nbsp; a[3] &nbsp; 也不会有本质区别——也许你该试试写成 &nbsp; int &nbsp; (&amp;a) &nbsp; [3] &nbsp; ？<span class=Apple-converted-space>&nbsp;</span><br><br>C++规定，数组作为形参的时候，a代表数组首地址。<span class=Apple-converted-space>&nbsp;</span><br>他的底层意义是： &nbsp; a &nbsp; 退化为了一个4字节的指针，没有任何变量表示数组的大小会&#8220;自动&#8221;被传递进来。<span class=Apple-converted-space>&nbsp;</span><br><br>我们看看这个时候 &nbsp; sizeof &nbsp; a是什么：<span class=Apple-converted-space>&nbsp;</span><br>sizeof( &nbsp; 函数形参的a[] &nbsp; ) &nbsp; &nbsp; = &nbsp; sizeof( &nbsp; int* &nbsp; const &nbsp; ) &nbsp; = &nbsp; 4 &nbsp; &nbsp; // &nbsp; 当然a[]不是合法的C++类型<span class=Apple-converted-space>&nbsp;</span><br><br><br>仍然不服气？好——我们反问一个问题：若你是C &nbsp; /C++的设计者， &nbsp; 你怎么在兼容原有设计的基础上让void &nbsp; func( &nbsp; int &nbsp; a[] &nbsp; )同时传递地址和大小？<span class=Apple-converted-space>&nbsp;</span><br><br>首先，a是一个变量，而且类似数组。他必须是一个地址，否则你不知道如何索引元素。<span class=Apple-converted-space>&nbsp;</span><br>他怎么再带上一个变量表示他的大小呢？<span class=Apple-converted-space>&nbsp;</span><br><br>扩充 &nbsp; sizeof &nbsp; (a) &nbsp; 的能力？<span class=Apple-converted-space>&nbsp;</span><br><br>sizeof &nbsp; a &nbsp; 必须产生代码——不管是常量还是什么。 &nbsp; 要让他在运行时决定 &nbsp; a的值， &nbsp; a就必须带上他的大小信息。 &nbsp;<span class=Apple-converted-space>&nbsp;</span><br><br>1 &nbsp; 你必须修改C标准，让C支持&#8220;两种&#8221;数组。一种是定义处的数组，他分配大片连续内存，和原来的C标准相同。<span class=Apple-converted-space>&nbsp;</span><br><br>2 &nbsp; 另一种是作为参数传递数组。 &nbsp; 你必须传递地址和数组大小；这个数组实际上是一个8字节的结构{ &nbsp; 地址; &nbsp; 大小}（事实上可能更加复杂，考虑多纬数组如何实现？ &nbsp; ） &nbsp;<span class=Apple-converted-space>&nbsp;</span><br><br>3 &nbsp; 系统必须根据两种不同数组分别实现其 &nbsp; []、* &nbsp; 、&amp;等。 &nbsp; 原有的数组根据其首地址偏移（这是个常量）和下标寻址； &nbsp; 而参数数组则首先取&#8220;地址&#8221;内容（这是个变量），然后根据这个地址寻址....<span class=Apple-converted-space>&nbsp;</span><br><br>厄... &nbsp; 再考虑多维数组——听起来这不是一整套vector模型么？<span class=Apple-converted-space>&nbsp;</span><br><br>-----------------------------------------------<span class=Apple-converted-space>&nbsp;</span><br>注1: &nbsp; 对于C99支持的 &nbsp; flexible &nbsp; array &nbsp; ，其 &nbsp; sizeof &nbsp; 运算是运行时求值</span></span><br><br></span></span></span>
<img src ="http://www.cppblog.com/deercoder/aggbug/140924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2011-03-01 17:14 <a href="http://www.cppblog.com/deercoder/archive/2011/03/01/140924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由一道关于C语言关于结构体的笔试题目想到的</title><link>http://www.cppblog.com/deercoder/archive/2010/05/29/116655.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Fri, 28 May 2010 16:53:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2010/05/29/116655.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/116655.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2010/05/29/116655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/116655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/116655.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">&nbsp;&nbsp; &nbsp; 今天下午去参加光电实验室的暑期实习生笔试，本来不大想去的，因为毕竟暑假已经确定了实习，所以即使通过了也肯定不会去的，而且到时候要解释的话也会很麻烦，不过作为国家重点实验室，我想看看笔试题目到底怎么样，也或许是因为最近刚好考试周完了，闲着蛋疼，所以就跑过去了。<br>&nbsp;&nbsp; 原题目很简单，就是如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct tr t[3] = {5,&amp;t[1],7,&amp;t[2],9,0};<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; struct tr *p;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p=&amp;t[0];
<br>&nbsp; 然后列出了几个选项，让说出了分别哪一个表达式表示的值为6.具体选项就是：<br>&nbsp;&nbsp;&nbsp;&nbsp; p-&gt;n++&nbsp;&nbsp; ++p-&gt;n&nbsp;&nbsp;&nbsp; (*p).n++&nbsp;&nbsp;&nbsp; ++p-&gt;n<br>&nbsp; 当然，题目的话选项还有些不记得了，不过觉得其实只要理解了原理，那么就很容易判断了。<br><br>先看代码：<br>&nbsp;
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;tr{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;tr&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">next;<br>};<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;tr&nbsp;t[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t[</span><span style="color: #000000;">1</span><span style="color: #000000;">],</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t[</span><span style="color: #000000;">2</span><span style="color: #000000;">],</span><span style="color: #000000;">9</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;tr&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p;<br>&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">=&amp;</span><span style="color: #000000;">t[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">p-&gt;n++=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">n</span><span style="color: #000000;">++</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">p-&gt;n=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">n);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">*p=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">*</span><span style="color: #000000;">p);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">(*p).n=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,(</span><span style="color: #000000;">*</span><span style="color: #000000;">p).n);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">(*p).n++=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,(</span><span style="color: #000000;">*</span><span style="color: #000000;">p).n</span><span style="color: #000000;">++</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">++p-&gt;n=%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">++</span><span style="color: #000000;">p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">n);<br>}<br><br><br>运行结果如下：<br>p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">n</span><span style="color: #000000;">++=</span><span style="color: #000000;">5</span><span style="color: #000000;"><br>p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">n</span><span style="color: #000000;">=</span><span style="color: #000000;">6</span><span style="color: #000000;"><br></span><span style="color: #000000;">*</span><span style="color: #000000;">p</span><span style="color: #000000;">=</span><span style="color: #000000;">6</span><span style="color: #000000;"><br>(</span><span style="color: #000000;">*</span><span style="color: #000000;">p).n</span><span style="color: #000000;">=</span><span style="color: #000000;">6</span><span style="color: #000000;"><br>(</span><span style="color: #000000;">*</span><span style="color: #000000;">p).n</span><span style="color: #000000;">++=</span><span style="color: #000000;">6</span><span style="color: #000000;"><br></span><span style="color: #000000;">++</span><span style="color: #000000;">p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">n</span><span style="color: #000000;">=</span><span style="color: #000000;">8</span><span style="color: #000000;"><br>Press&nbsp;any&nbsp;key&nbsp;to&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;"><br><br></span></div>
<br>&nbsp;首先，看看上面的题目中的那个初始化的含义吧！<br>&nbsp;struct tr t[3] = {5,&amp;t[1],7,&amp;t[2],9,0};
<img  src="http://www.cppblog.com/images/cppblog_com/deercoder/Link.jpg" border="0"><br>
<br>注意这样的一个结构体式可以初始化的，不同于C++的作用域限定范围！struct是公有的数据访问权限。<br><br>剩下了的问题就是，各个的含义是多少了。<br>p-&gt;n 表示的就是p指向的节点的证书范围域，所以是5，当然：重点来了，由于是说的表达式的值，所以分为前置和后置表达式的区别了。<br>（关于前置和后置的区别见我的这篇博文：<a  href="http://www.cppblog.com/deercoder/archive/2010/01/22/106251.aspx">http://www.cppblog.com/deercoder/archive/2010/01/22/106251.aspx</a>
）<br>如果是p-&gt;n++,那么这个表达式的值为：5，但是运算完成之后，n的值会变化，所以n的值是6，但是表达式的值的含义要搞清楚，确切的说就是这个表达式的结果，由于后置的++是在完成之后才做的，所以不能影响到表达式的值，于是就为5。<br>而前置的++则是先进行++运算之后才得到运算的结果，所以如果是++p-&gt;n的话值就是6.<br><br>注意我的这个Demo的例子中，由于将所有表达式的值都放在一起输出，所以前面的操作会影响后面的值和表达式。比如第一个输出时5，但是会修改第一个节点的n值变为6，所以后面的输出相应的要修改！<br><br>题目中问的是值，所以直接单个的输出也是可以的，注意更能直接的看到结果。<br>另外很简单的几点是：<br>1. p-&gt;&nbsp; 和 *p. 操作时一样性质，一直是直接指针访问，一个是用的先访问节点，然后通过节点的域来得到相应的值。<br><br>2.运算的优先级。注意-&gt;和.操作符的运算级都要高些，所以先进行的。<br><br>3.等价的写法。p-&gt;n ===========(*p).n<br><br><br>ps:前段时间忙着准备考试，考试周当然比较忙，而且突然发现最近博客没有怎么更新了，说明自己常常以各种借口放松对技术的学习，鄙视下自己，总结下前段时间的事情吧：<br><br>1.准备考研。说是准备，其实就是看看单词，不过觉得还是比较难，很多不认识，由于没有拿到保底的工作offer，所以现在就只能破釜沉舟了，后面也就没有参加或者不计划参加什么网易游戏，阿里巴巴，百度什么的笔试了，毕竟想起来要是暑假实习就耗上2个多月或者3个月的话，考研的事情就会彻底的泡汤了。<br><br>2.软考。再次华丽丽的裸考，大学里面的裸考很多啊，四六级都是，不过分数不错，而且我也比较容易满足，都是550+，虽然不高，不过一次性过了，而且没有付出的感觉还是很好。这次软件设计的考试，完全都没有时间准备，因为有期中考试和无尽的实验，虽然考到软件工程和设计模式的话我全部都是懵的，不过上午题目觉得问题不大，而下午的就觉得比较悬了，感觉凭着一点老底子，有一半希望吧。（数据流图，设计模式，软件工程完全不会啊~~）<br><br>3.考试周。昨天才考完，下半学期又要忙了，没办法，先缓缓吧。<br></span><img src ="http://www.cppblog.com/deercoder/aggbug/116655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-05-29 00:53 <a href="http://www.cppblog.com/deercoder/archive/2010/05/29/116655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Main函数参数argc，argv说明[zz]</title><link>http://www.cppblog.com/deercoder/archive/2010/03/01/108685.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Mon, 01 Mar 2010 11:32:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2010/03/01/108685.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/108685.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2010/03/01/108685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/108685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/108685.html</trackback:ping><description><![CDATA[<h1 class="firstHeading">Wikipedia，自由的百科全书</h1>
<div id="bodyContent">
<div id="contentSub">
</div>
<!-- start content -->
<p>C/C++语言中的main函数，经常带有参数argc，argv，如下： </p>
<pre>int main(int argc, char** argv)
</pre>
<pre>int main(int argc, char* argv[])
</pre>
<p>这两个参数的作用是什么呢？argc 是指命令行输入参数的个数，argv存储了所有的命令行参数。假如你的程序是hello.exe，如果在命令行运行该程序，（首先应该在命令行下用 cd 命令进入到 hello.exe 文件所在目录） 运行命令为： </p>
<pre>hello.exe Shiqi Yu
</pre>
<p>那么，argc的值是 3，argv[0]是"hello.exe"，argv[1]是"Shiqi"，argv[2]是"Yu"。 <a class="image" title="Image:Hello-argc-argv.png" href="http://www.opencv.org.cn/index.php/Image:Hello-argc-argv.png"><img alt="Image:Hello-argc-argv.png" src="http://www.opencv.org.cn/images/8/85/Hello-argc-argv.png" longdesc="/index.php/Image:Hello-argc-argv.png" width="738" height="287"></a></p>
<p>下面的程序演示argc和argv的使用： </p>
<pre>#include &lt;stdio.h&gt;
int main(int argc, char ** argv)
{
int i;
for (i=0; i &lt; argc; i++)
printf("Argument %d is %s.\n", i, argv[i]);
return 0;
}
</pre>
<p>假如上述代码编译为hello.exe，那么运行 </p>
<pre>hello.exe a b c d e
</pre>
<p>将得到 </p>
<pre>Argument 0 is hello.exe.
Argument 1 is a.
Argument 2 is b.
Argument 3 is c.
Argument 4 is d.
Argument 5 is e.
</pre>
<p>运行 </p>
<pre>hello.exe lena.jpg
</pre>
<p>将得到 </p>
<pre>Argument 0 is hello.exe.
Argument 1 is lena.jpg.</pre>
</div><img src ="http://www.cppblog.com/deercoder/aggbug/108685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-03-01 19:32 <a href="http://www.cppblog.com/deercoder/archive/2010/03/01/108685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>