﻿<?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++博客-circle on -文章分类-c raise</title><link>http://cppblog.com/silvercell/category/21281.html</link><description>c i really c long e-tool</description><language>zh-cn</language><lastBuildDate>Fri, 14 Jul 2017 10:47:10 GMT</lastBuildDate><pubDate>Fri, 14 Jul 2017 10:47:10 GMT</pubDate><ttl>60</ttl><item><title>007 string  model in project</title><link>http://www.cppblog.com/silvercell/articles/215102.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Fri, 14 Jul 2017 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215102.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215102.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215102.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 项目开发中字符串模型建立strstr的while dowhile模型//int cltClient_rev(void *handle, unsigned char *buf, int *buflen)//不要相信别人给你传送的内存地址是可用的int getCout(char *str, char *substr, int *count){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/silvercell/articles/215102.html'>阅读全文</a><img src ="http://www.cppblog.com/silvercell/aggbug/215102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-14 15:46 <a href="http://www.cppblog.com/silvercell/articles/215102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>006 string and pointer</title><link>http://www.cppblog.com/silvercell/articles/215099.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Thu, 13 Jul 2017 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215099.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215099.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215099.html</trackback:ping><description><![CDATA[<br />the basic operate<br />一级指针的典型用法 : 数组 、 <strong>字符串</strong><br /><br /><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">在C语言中使用字符数组来模拟字符串</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">C语言中的字符串是以&#8217;\0&#8217;结束的字符数组</span></p><p><span style="font-family: 宋体; font-size: 10.5pt;">C语言中的字符串可以分配于栈空间，堆空间或者只读存储区</span></p><p><span style="font-family: 宋体; font-size: 10.5pt;"><br /><strong>字符和字符数组</strong>:</span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;*&nbsp;argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[120]=&nbsp;"hello";<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s",&nbsp;buf);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf2[120]&nbsp;=&nbsp;{'h','e','l','l','o'};<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;buf2);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf3[]&nbsp;=&nbsp;"world";<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;,&nbsp;%d"&nbsp;,&nbsp;strlen(buf3)&nbsp;,&nbsp;<span style="color: #0000FF; ">sizeof</span>(buf3));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br />&nbsp;<strong>数组或指针操作字符串</strong>：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[10]&nbsp;=&nbsp;"hello";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&lt;strlen(buf)&nbsp;;&nbsp;i++&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%c"&nbsp;,&nbsp;buf[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;buf;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向&nbsp;buf[0]的地址不是数组！！！&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&lt;strlen(buf);&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%c",&nbsp;*(p+i));<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;hello<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;hello</span><span style="color: #008000; "><br /></span>}</div><br />buf[i] --&gt; buf[0+i] --&gt; *(buf+i)<br /><br />中括号的本质:<br />buf5[10];<br />buf5 = buf5 + 1<br />buf5 是一个常量指针。编译器这么做的。<br /><br />为什么这么做？<br />如果进行栈的内存回收 ， 如果允许 常量指针buf5 修改地址 则很难在修改之后找到buf 的地址对这段内存进行析构。<br />为可保证 数组 这块内存首地址的安全 buf5 是一个常量 ， 传到函数中也是常量指针地址不能轻易改变。<br />这就是为什么 指针 p = p+1; 可以 ； buf5 = buf5 +1;不可以；<br /><br /><br />字符串一级指针的内存模型图<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[20]&nbsp;=&nbsp;"aaaaa";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf2[]&nbsp;=&nbsp;"11111";<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p1&nbsp;=&nbsp;"mmmmm";<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p2&nbsp;=&nbsp;malloc(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(p2,"222222");&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;free(p2);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/silvercell/字符串一级指针的内存模型图.png" width="1176" height="502" alt="" /><br />-----<br /><br /><strong style="font-size: 12pt;">字符串做函数参数</strong><br /><br />业务模型和测试案例分开：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;cpstr(<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;q)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(;&nbsp;*p&nbsp;!=&nbsp;'\0';&nbsp;p++,&nbsp;q++&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*q&nbsp;=&nbsp;*p;<br />// &nbsp; &nbsp; &nbsp;*q++ = *q++; &nbsp; 先&nbsp;&nbsp;*q&nbsp;=&nbsp;*p; &nbsp;再 p++,&nbsp;q++<br />&nbsp; &nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;*q&nbsp;=&nbsp;'\0';<br />}<br />/* 改进不用手动添加 &nbsp;\0<br />&nbsp; &nbsp;while( (*q = *p) !=0)<br />&nbsp; &nbsp;{<br />&nbsp; &nbsp; &nbsp; p++;<br />&nbsp; &nbsp; &nbsp; q++;<br />&nbsp; &nbsp;}<br />*/<br /><br />/*<br /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp;while( (*q++ = *p++) !=0)</span><br style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;" /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp;{</span><br style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;" /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp; &nbsp; </span><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">;</span><br style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;" /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp;}</span><br />*/<br /><br />/*<br /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp;while( (*q++ = *p++))</span><br style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;" /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp;{</span><br style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;" /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">;</span><br style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;" /><span style="color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff;">&nbsp; &nbsp;}</span><br />*/<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;"helloworld";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;dest[100];<br />&nbsp;&nbsp;&nbsp;&nbsp;cpstr(p&nbsp;,&nbsp;dest);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("dest:&nbsp;%s"&nbsp;,&nbsp;dest);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br />业务模型和测试案例未分开：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main004()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;from[]&nbsp;=&nbsp;"helloworld";&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;to[20];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(i&nbsp;=&nbsp;0;&nbsp;*(from+i)&nbsp;!=&nbsp;'\0';&nbsp;i++&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(to&nbsp;+&nbsp;i)&nbsp;=&nbsp;*(from+i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;to[i]&nbsp;=&nbsp;'\0';<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n"&nbsp;,&nbsp;from);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n"&nbsp;,&nbsp;to);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><img src="http://www.cppblog.com/images/cppblog_com/silvercell/为什么在buf结尾补0示意图.png" width="1176" height="502" alt="" /><br />改进代码<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;cpstr(<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;q)<br />{<br /><br /><span style="background-color: yellow;">//在形参中另存一份 &nbsp;辅助变量 不要轻易改变形参的值</span><br />&nbsp; &nbsp;char * p = tmp_p;<br />&nbsp; &nbsp;char * q = tmp_q;<br />&nbsp; &nbsp; &nbsp; //所以<span style="color: red;">不会影响主调用函数指针的指向。</span><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(;&nbsp;*p&nbsp;!=&nbsp;'\0';&nbsp;p++,&nbsp;q++&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*q&nbsp;=&nbsp;*p;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*q++&nbsp;=&nbsp;*q++;&nbsp;&nbsp;&nbsp;先&nbsp;&nbsp;*q&nbsp;=&nbsp;*p;&nbsp;&nbsp;再&nbsp;p++,&nbsp;q++</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;*q&nbsp;=&nbsp;'\0';<br />}<br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;改进不用手动添加&nbsp;&nbsp;\0<br />&nbsp;&nbsp;&nbsp;while(&nbsp;(*q&nbsp;=&nbsp;*p)&nbsp;!=0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q++;<br />&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008000; ">*/</span><br /><br /><span style="color: #008000; ">/*<br /><br /></span><span style="color: red;">&nbsp; &nbsp;if( p ==NULL || q= NULL)</span><br /><span style="color: red;">&nbsp; &nbsp;{</span><br /><span style="color: red;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;</span><span style="color: #008000; "><br /></span>&nbsp; &nbsp;<span style="color: red;">} //添加判断</span><span style="color: #008000; "><br /></span><span style="color: #008000; "><br /></span>&nbsp; &nbsp;// &nbsp;-&gt; &nbsp;<span style="color: #008000;">while(&nbsp;(*q++&nbsp;=&nbsp;*p++)&nbsp;!=0)；</span><br /><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;while(&nbsp;(*q++&nbsp;=&nbsp;*p++)&nbsp;!=0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008000; ">*/</span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;while(&nbsp;(*q++&nbsp;=&nbsp;*p++))<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008000; ">*/</span><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;"helloworld";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;dest[100];<br />&nbsp;&nbsp;&nbsp;&nbsp;cpstr(p&nbsp;,&nbsp;dest);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("dest:&nbsp;%s"&nbsp;,&nbsp;dest);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br />项目开发中的字符串模型<br /><br /><br />strstr _ while do_while<br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/silvercell/aggbug/215099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-13 12:58 <a href="http://www.cppblog.com/silvercell/articles/215099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>005 the pointer use for indirect assignment</title><link>http://www.cppblog.com/silvercell/articles/215094.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Wed, 12 Jul 2017 10:18:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215094.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215094.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215094.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215094.html</trackback:ping><description><![CDATA[<strong><br />malloc 和 free 错误:</strong><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;)malloc(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(p&nbsp;,&nbsp;"hello"); &nbsp;"hello" 实际上是一个地址 将这个地址的内容复制到p 直到 &nbsp;\0 结束<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;p&nbsp;!=&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(p);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;NULL;&nbsp;解决方法&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp; &nbsp; //此时 p 是个野指针 ， 指向一块垃圾数据<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;p!=&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br />释放指针所指的空间， 但是指针的值没有重置为NULL<br />造成释放通过 &nbsp;if(p != NULL) 判断不出来， 所以 free() 时候要进行 指针重置为 NULL<br /><br /><br />indirect assignment use pointer<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;changevar(<span style="color: #0000FF; ">int</span>&nbsp;*&nbsp;p&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;20;<br />&nbsp; &nbsp;//通过函数将运算结果甩出来！！！<br />&nbsp;&nbsp;&nbsp;// **** <span style="background-color: yellow;">很方便的返回多个结果很强大</span> &nbsp;*****<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;&amp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%d"&nbsp;,&nbsp;a);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;---------</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;changevar(&amp;a);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;---------&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;printf("%d"&nbsp;,&nbsp;a);<br />}&nbsp;</div><br /><span style="color: red;">通过指针做函数参数的方法 间接赋值改变运算结果</span><br /><br />形参的提醒:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;changevar(<span style="color: #0000FF; ">int</span>&nbsp;*&nbsp;p&nbsp;)<br />{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">参数表中的参数和函数体的参数本质上是一样的<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;参数表的参数多了&nbsp;个对外属性</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;20;<br />}</div><br />字面量的提示:<br /><br />使用<span style="color: red; background-color: yellow;">二级指针修改一级指针的地址:</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;getMem(<span style="color: #0000FF; ">char</span>&nbsp;**&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;200;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">用二级指针间接修改一级指针的指向地址&nbsp;</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**&nbsp;q&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=100;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("p:&nbsp;%d&nbsp;\n"&nbsp;,&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;q=&nbsp;&amp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;getMem(q);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("p:&nbsp;%d"&nbsp;,&nbsp;p);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">p:&nbsp;100<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">p:&nbsp;200</span><span style="color: #008000; "><br /></span>}</div><br /><br />关键就是内存 和 函数调用的模型图；<br /><br /><br />为什么用一级指针无法改变以及指针的指向， 堆栈调用图很快就能理解！！！<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;getMem2(<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;400;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">用二级指针间接修改一级指针的指向地址&nbsp;</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;q&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>&nbsp;*)malloc(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=100;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("p:&nbsp;%d&nbsp;\n"&nbsp;,&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;*q=&nbsp;&amp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;getMem2(q);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("p:&nbsp;%d"&nbsp;,&nbsp;p);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">p:&nbsp;100<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">p:&nbsp;100</span><span style="color: #008000; "><br /></span>}</div><br /><br /><strong>指针使用的精髓:</strong><br /><span style="color: red; background-color: yellow;">不同函数同时操作一块内存空间时</span>，通过内存首地址将内存传过去。运算结果在不同函数中并将其甩出来给主函数。<br />将计算过程在不同的函数中进行分解。<br /><br /><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;getMem(</span><span style="font-size: 13px; color: #0000ff;">char</span><span style="font-size: 13px;">&nbsp;**&nbsp;myp1,&nbsp;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;*&nbsp;len1&nbsp;)</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">char</span><span style="font-size: 13px;">&nbsp;*&nbsp;tmp1&nbsp;=&nbsp;(</span><span style="font-size: 13px; color: #0000ff;">char</span><span style="font-size: 13px;">&nbsp;*&nbsp;)malloc(100);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;strcpy(tmp1&nbsp;,&nbsp;"helloworld");</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;*len1&nbsp;=&nbsp;strlen(tmp1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;*myp1&nbsp;=&nbsp;tmp1;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("in&nbsp;func&nbsp;getMem:\n");</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("tmp1:&nbsp;%s\n"&nbsp;,&nbsp;tmp1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("tmp1:&nbsp;%d\n"&nbsp;,&nbsp;tmp1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("len1:&nbsp;%d\n"&nbsp;,&nbsp;*len1);</span><br /><span style="font-size: 13px;">}</span><br /><br /><br /><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;main(</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;argc,&nbsp;</span><span style="font-size: 13px; color: #0000ff;">char</span><span style="font-size: 13px;">&nbsp;*&nbsp;*&nbsp;argv)</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">char</span><span style="font-size: 13px;">&nbsp;*&nbsp;p1&nbsp;=&nbsp;NULL;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;&nbsp;len1&nbsp;=&nbsp;0;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;getMem(&amp;p1,&nbsp;&amp;len1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("in&nbsp;main()\n&nbsp;");&nbsp;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("p1:&nbsp;%s\n"&nbsp;,&nbsp;p1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("p1:&nbsp;%d\n"&nbsp;,&nbsp;p1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("len:&nbsp;%d\n"&nbsp;,&nbsp;len1);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><br /><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">return</span><span style="font-size: 13px;">&nbsp;0;</span><br /><span style="font-size: 13px;">}</span><br /><br /><span style="font-size: 13px;">/*</span><br /><div>&nbsp; &nbsp;<span style="font-size: 13px;">in func getMem:</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">tmp1: helloworld</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">tmp1: 136160</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">len1: 10</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">in main()</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">p1: helloworld</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">p1: 136160</span></div><div>&nbsp; &nbsp;<span style="font-size: 13px;">len: 10</span></div><span style="font-size: 13px;">*/</span></div><br />指针做函数参数的典型应用场景：<br /><br />main 函数 为了完成某个任务 ，写很多子函数。通过指针做函数参数实现 main 和子业务的分层。 模块划分的初步。<br /><span style="color: red;">分层、 模块、 接口封装和设计、 软件的功能之间的划分 、软件信息系统</span><br /><br /><br />在一个函数中进行简介赋值：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;from[120];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;to[120];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p1&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;=&nbsp;from;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p2&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;=&nbsp;to;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(p1,&nbsp;"helloworld");<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(&nbsp;*p1&nbsp;!=&nbsp;'\0')<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p2++&nbsp;=&nbsp;*p1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;*p2&nbsp;=&nbsp;'\0';<span style="color: #008000; ">//</span><span style="color: #008000; ">并没有将&nbsp;'\0'拷进去直接打印会发生错误&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("to:&nbsp;%s"&nbsp;,&nbsp;to);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><br /><strong>指针间接赋值的推论:</strong><br />使用n级指针 ， 更改 n-1 级指针的值。<br /><br />指针的半壁江山 10 铁律。<br />另外？ 函数参数 回调函数<br /><br /><br /><strong>指针作函数参数的输入和输出特性</strong>:<br /><br />主调函数提前分配内存 将内存传给被调用函数 叫指针的输入<br />被调函数分配内存将结果输出 供给主调函数使用<br /><br />学习思路:<br />没有内存哪有指针， 指针是指向内存地址编号的变量。类型是变量的类型。<br />指针的关键在内存的分析。内存是如何分配的！！！<br /><br /><br /><h3><strong><span style="font-family: 宋体; font-size: 16pt;">铁律4：应用指针必须和函数调用相结合（指针做函数参数） </span></strong><strong></strong></h3><table style="border-collapse:collapse;width:426.1000pt;"><tbody><tr><td width="54" valign="top" style="width:40.8000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:1.0000pt solid windowtext;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">编号</span></p></td><td width="263" valign="top" colspan="2" style="width:197.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p style="text-indent:26.2500pt;"><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">指针函数参数</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">内存分配方式（级别+堆栈）</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">主调函数</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">实参</span></p></td><td width="82" valign="top" colspan="4" style="width:61.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">被调函数</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">形参</span></p></td><td width="85" valign="top" style="width:64.3500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">备注</span></p><p>&nbsp;</p></td></tr><tr><td width="54" valign="top" rowspan="3" style="width:40.8000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:1.0000pt solid windowtext;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">01</span></p></td><td width="122" valign="top" rowspan="3" style="width:92.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">1级指针</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">（做输入）</span></p></td><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">堆</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">分配</span></p></td><td width="82" valign="top" colspan="4" style="width:61.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="85" valign="top" style="width:64.3500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">一般应用禁用</span></p></td></tr><tr><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">栈</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">分配</span></p></td><td width="82" valign="top" colspan="4" style="width:61.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="85" valign="top" style="width:64.3500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">常用</span></p></td></tr><tr><td width="390" valign="top" colspan="7" style="width:293.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">Int </span><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">showbuf(char *p); &nbsp;&nbsp;</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int showArray(int *array, int iNum)</span></p></td></tr><tr><td width="54" valign="top" rowspan="2" style="width:40.8000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:1.0000pt solid windowtext;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">02</span></p></td><td width="122" valign="top" rowspan="2" style="width:92.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">1级指针</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">（做输出）</span></p></td><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">栈</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="82" valign="top" colspan="4" style="width:61.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">结果传出</span></p></td><td width="85" valign="top" style="width:64.3500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">常用</span></p></td></tr><tr><td width="390" valign="top" colspan="7" style="width:293.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int geLen(char *pFileName, int *pfileLen);</span></p></td></tr><tr><td width="54" valign="top" rowspan="3" style="width:40.8000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:1.0000pt solid windowtext;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">03</span></p></td><td width="122" valign="top" rowspan="3" style="width:92.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">2级指针</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">（做输入）</span></p></td><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">堆</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">分配</span></p></td><td width="82" valign="top" colspan="4" style="width:61.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="85" valign="top" style="width:64.3500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">一般应用禁用</span></p></td></tr><tr><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">栈</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">分配</span></p></td><td width="82" valign="top" colspan="4" style="width:61.7500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="85" valign="top" style="width:64.3500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">常用</span></p></td></tr><tr><td width="390" valign="top" colspan="7" style="width:293.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int main(int arc ,char *arg[]); 指针数组</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int shouMatrix(int [3][4], int iLine);二维字符串数组</span></p></td></tr><tr><td width="54" valign="top" rowspan="2" style="width:40.8000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:1.0000pt solid windowtext;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">04</span></p></td><td width="122" valign="top" rowspan="2" style="width:92.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">2级指针</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">（做输出）</span></p></td><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">堆</span></p></td><td width="81" valign="top" style="width:61.4500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="78" valign="top" colspan="2" style="width:58.8500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">分配</span></p></td><td width="89" valign="top" colspan="3" style="width:67.2500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">常用，但不建议用，转化成02</span></p></td></tr><tr><td width="390" valign="top" colspan="7" style="width:293.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int getData(char **data, int *dataLen);</span></p><p><span style="font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">I</span><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">nt getData_Free(void *data);</span></p><p><span style="font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">I</span><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">nt getData_Free(void **data); //避免野指针 </span></p></td></tr><tr><td width="54" valign="top" rowspan="2" style="width:40.8000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:1.0000pt solid windowtext;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">05</span></p></td><td width="122" valign="top" rowspan="2" style="width:92.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">3级指针</span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">（做输出）</span></p></td><td width="140" valign="top" style="width:105.6000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">堆</span></p></td><td width="84" valign="top" colspan="2" style="width:63.2500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">使用</span></p></td><td width="78" valign="top" colspan="2" style="width:59.2000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">分配</span></p></td><td width="86" valign="top" colspan="2" style="width:65.1000pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">不常用</span></p></td></tr><tr><td width="390" valign="top" colspan="7" style="width:293.1500pt;padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ;border-left:none;;;border-right:1.0000pt solid windowtext;border-top:none;;border-bottom:1.0000pt solid windowtext;"><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int getFileAllLine(char ***content, int *pLine); </span></p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;">int getFileAllLine_Free(char ***content, int *pLine);</span></p></td></tr></tbody></table><p>&nbsp;</p><p><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;">指针做函数参数，问题的实质不是指针，而是看内存块，内存块是1维、2维。</span></p><p style="margin-left:18.1500pt;text-indent:-18.1500pt;"><span style="font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;">1）&nbsp;</span><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;">如果基础类int变量，不需要用指针；</span></p><p style="margin-left:18.1500pt;text-indent:-18.1500pt;"><span style="font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;">2）&nbsp;</span><span style="mso-spacerun:'yes';font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:12.0000pt;">若内存块是1维、2维。</span></p><br /><br /><img src ="http://www.cppblog.com/silvercell/aggbug/215094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-12 18:18 <a href="http://www.cppblog.com/silvercell/articles/215094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>004 pointer laws 1、2、3</title><link>http://www.cppblog.com/silvercell/articles/215092.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Wed, 12 Jul 2017 09:49:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215092.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215092.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215092.html</trackback:ping><description><![CDATA[<div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 24px; font-family: SimSun, STSong; font-weight: bold;">指针铁律专题</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">铁律</span><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">1</span><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">：指针是一种数据类型 &nbsp;</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px;">1）&nbsp;</span><span style="font-size: 16px; font-family: SimSun, STSong;">指针也是一种变量，占有内存空间，用来保存内存地址</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">测试指针变量占有内存空间大小</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">2</span><span style="font-size: 16px; font-family: SimSun, STSong;">）</span><span style="font-size: 16px; font-family: Calibri;">*p</span><span style="font-size: 16px; font-family: SimSun, STSong;">操作内存</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">在指针声明时，</span><span style="font-family: SimSun, STSong;">*</span><span style="font-family: SimSun, STSong;">号表示所声明的变量为指针</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">在指针使用时，</span><span style="font-family: SimSun, STSong;">*</span><span style="font-family: SimSun, STSong;">号表示 操作 指针所指向的内存空间中的值</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-family: SimSun, STSong;">*p</span><span style="font-family: SimSun, STSong;">相当于通过地址</span><span style="font-family: Calibri;">(p</span><span style="font-family: SimSun, STSong;">变量的值</span><span style="font-family: Calibri;">)</span><span style="font-family: SimSun, STSong;">找到一块内存；然后操作内存</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-family: SimSun, STSong;">*p</span><span style="font-family: SimSun, STSong;">放在等号的左边赋值（给内存赋值）</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-family: SimSun, STSong;">*p</span><span style="font-family: SimSun, STSong;">放在等号的右边取值（从内存获取值）</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">3</span><span style="font-size: 16px; font-family: SimSun, STSong;">）指针变量和它指向的内存块是两个不同的概念</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">//</span><span style="font-family: SimSun, STSong;">含义</span><span style="font-family: Calibri;">1 </span><span style="font-family: SimSun, STSong;">给</span><span style="font-family: Calibri;">p</span><span style="font-family: SimSun, STSong;">赋值</span><span style="font-family: Calibri;">p=0x1111; </span><span style="font-family: SimSun, STSong;">只会改变指针变量值，不会改变所指的内容；</span><span style="font-family: Calibri;">p = p +1; //p++</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">//</span><span style="font-family: SimSun, STSong;">含义</span><span style="font-family: Calibri;">2 </span><span style="font-family: SimSun, STSong;">给</span><span style="font-family: Calibri;">*p</span><span style="font-family: SimSun, STSong;">赋值</span><span style="font-family: Calibri;">*p='a'; </span><span style="font-family: SimSun, STSong;">不会改变指针变量的值，只会改变所指的内存块的值 &nbsp;</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">//</span><span style="font-family: SimSun, STSong;">含义</span><span style="font-family: Calibri;">3 =</span><span style="font-family: SimSun, STSong;">左边</span><span style="font-family: Calibri;">*p </span><span style="font-family: SimSun, STSong;">表示 给内存赋值， </span><span style="font-family: Calibri;">=</span><span style="font-family: SimSun, STSong;">右边</span><span style="font-family: Calibri;">*p </span><span style="font-family: SimSun, STSong;">表示取值 含义不同切结！</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">//</span><span style="font-family: SimSun, STSong;">含义</span><span style="font-family: Calibri;">4 =</span><span style="font-family: SimSun, STSong;">左边</span><span style="font-family: Calibri;">char *p</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong; color: #ff0000;">//</span><span style="font-family: SimSun, STSong; color: #ff0000;">含义</span><span style="font-family: Calibri; color: #ff0000;">5 </span><span style="font-family: SimSun, STSong; color: #ff0000;">保证所指的内存块能修改</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">4</span><span style="font-size: 16px; font-family: SimSun, STSong;">）指针是一种数据类型，是指它指向的内存空间的数据类型</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">含义</span><span style="font-family: SimSun, STSong;">1</span><span style="font-family: SimSun, STSong;">：指针步长（</span><span style="font-family: Calibri;">p++</span><span style="font-family: SimSun, STSong;">），根据所致内存空间的数据类型来确定</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">p++=</span>&#232;<span style="font-family: SimSun, STSong;">(unsigned char )p+sizeof(a);</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-family: SimSun, STSong;">结论：指针的步长，根据所指内存空间类型来定。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;">&nbsp;</div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">铁律</span><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">2</span><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">：通过</span><span style="font-size: 21px; font-family: Cambria; font-weight: bold;">*p/*p++ </span><span style="font-size: 21px; font-family: SimSun, STSong; font-weight: bold;">来改变变量的值是指针存在的最大意义</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">1</span><span style="font-size: 16px; font-family: SimSun, STSong;">）两码事：指针变量和它指向的内存块变量</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">2</span><span style="font-size: 16px; font-family: SimSun, STSong;">）条件反射：指针指向某个变量，就是把某个变量地址否给指针</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">3</span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">）</span><span style="font-size: 16px; font-family: Calibri; color: #ff0000;">*p</span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">间接赋值成立条件：</span><span style="font-size: 16px; font-family: Calibri; color: #ff0000;">3</span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">个条件</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; color: #ff0000;">a)</span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">2</span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">个变量（通常一个实参，一个形参）</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">b) </span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">建立关系，实参取地址赋给形参指针</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">c) *p</span><span style="font-size: 16px; font-family: SimSun, STSong; color: #ff0000;">形参去间接修改实参的值</span></div><div style="width: 100%; overflow: auto; font-family: -apple-system, BlinkMacSystemFont, &quot;PingFang SC&quot;, Helvetica, Tahoma, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif;"><table cellspacing="0" cellpadding="0" border="1" style="table-layout: fixed; border-collapse: collapse; border-style: solid; border-color: #cccccc; width: 426px;"><colgroup><col style="width: 426px;"></colgroup><tbody><tr style="height: 40px;"><td style="word-wrap: break-word; font-size: 12px; height: 12px; vertical-align: top;">Int iNum = 0; //实参<br />int *p = NULL;<br />p = &amp;iNum;<br />iNum = 1;<br />*p =2 ; //通过*形参 == 间接地改变实参的值<br />*p成立的三个条件：</td></tr><tr style="height: 40px;"><td style="word-wrap: break-word; vertical-align: top;"><br /></td></tr></tbody></table></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong; font-weight: bold;">4</span><span style="font-size: 16px; font-family: SimSun, STSong; font-weight: bold;">）引申： 函数调用时</span><span style="font-size: 16px; font-family: Calibri; font-weight: bold;">,</span><span style="font-size: 16px; font-family: SimSun, STSong; font-weight: bold;">用</span><span style="font-size: 16px; font-family: Calibri; font-weight: bold;">n</span><span style="font-size: 16px; font-family: SimSun, STSong; font-weight: bold;">指针（形参）改变</span><span style="font-size: 16px; font-family: Calibri; font-weight: bold;">n-1</span><span style="font-size: 16px; font-family: SimSun, STSong; font-weight: bold;">指针（实参）的值。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">//</span><span style="font-size: 16px; font-family: SimSun, STSong;">改变</span><span style="font-size: 16px; font-family: Calibri;">0</span><span style="font-size: 16px; font-family: SimSun, STSong;">级指针（</span><span style="font-size: 16px; font-family: Calibri;">int iNum = 1</span><span style="font-size: 16px; font-family: SimSun, STSong;">）的值有</span><span style="font-size: 16px; font-family: Calibri;">2</span><span style="font-size: 16px; font-family: SimSun, STSong;">种方式</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">//</span><span style="font-size: 16px; font-family: SimSun, STSong;">改变</span><span style="font-size: 16px; font-family: Calibri;">1</span><span style="font-size: 16px; font-family: SimSun, STSong;">级指针（</span><span style="font-size: 16px; font-family: Calibri;">eg char *p = 0x1111 </span><span style="font-size: 16px; font-family: SimSun, STSong;">）的值，有</span><span style="font-size: 16px; font-family: Calibri;">2</span><span style="font-size: 16px; font-family: SimSun, STSong;">种方式</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">//</span><span style="font-size: 16px; font-family: SimSun, STSong;">改变</span><span style="font-size: 16px; font-family: Calibri;">2</span><span style="font-size: 16px; font-family: SimSun, STSong;">级指针的（</span><span style="font-size: 16px; font-family: Calibri;">eg char **pp1 = 0x1111 </span><span style="font-size: 16px; font-family: SimSun, STSong;">）的值，有</span><span style="font-size: 16px; font-family: Calibri;">2</span><span style="font-size: 16px; font-family: SimSun, STSong;">种方式</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;">&nbsp;</div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">//</span><span style="font-size: 16px; font-family: SimSun, STSong;">函数调用时，形参传给实参，用实参取地址，传给形参，在被调用函数里面用</span><span style="font-size: 16px; font-family: Calibri;">*p</span><span style="font-size: 16px; font-family: SimSun, STSong;">，来改变实参，把运算结果传出来。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;"><span style="font-size: 16px; font-family: SimSun, STSong;">//</span><span style="font-size: 16px; font-family: SimSun, STSong;">指针作为函数参数的精髓。</span></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;">&nbsp;</div><div style="width: 100%; overflow: auto; font-family: -apple-system, BlinkMacSystemFont, &quot;PingFang SC&quot;, Helvetica, Tahoma, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, 微软雅黑, SimSun, 宋体, Heiti, 黑体, sans-serif;"><table cellspacing="0" cellpadding="0" border="1" style="table-layout: fixed; border-collapse: collapse; border-style: solid; border-color: #cccccc; width: 426px;"><colgroup><col style="width: 426px;"></colgroup><tbody><tr style="height: 40px;"><td style="word-wrap: break-word; font-family: SimSun, STSong; font-size: 14px; height: 14px; vertical-align: top;">间接赋值的应用场景分析</td></tr><tr style="height: 40px;"><td style="word-wrap: break-word; font-size: 14px; height: 14px; vertical-align: top;">//C++多态实现的技术推演<br />//AOP切面编程 （java 2-3），3<br />//1定义一个变量（通常是实参） 定义一个变量（通常是形参）<br />//2建立联系 把实参取地址取地址传给形参<br />//3*p形参，就间接地修改了是实参的值。<br /> <br />//*p = 10;<br /> <br />//间接赋值应用场景概念建立<br />//1 在一个函数里面<br />//*p1++ = *p2++ //完成内存块的copy<br />//2 在两个函数之间，指针做函数参数把运算结果给甩出来<br />//123 <br />//12 3<br />//1  23</td></tr><tr style="height: 40px;"><td style="word-wrap: break-word; font-size: 14px; height: 14px; vertical-align: top;">间接赋值的推论=====&#232;指针做函数参数</td></tr><tr style="height: 40px;"><td style="word-wrap: break-word; font-size: 14px; height: 14px; vertical-align: top;">//在函数调用的时候<br /> //用1级指针（形参）去改变了0级指针（实参）的值 （通过*p去间接修改了实参的在值）<br /> <br /> //用2级指针（形参）去改变了1级指针（实参）的值 （通过*p去间接修改了实参的在值）<br /> //用3级指针（形参）去改变了2级指针（实参）的值 （通过*p去间接修改了实参的在值）<br /> //用n级指针（形参）去改变了n-1级指针（实参）的值 （通过*p去间接修改了实参的在值）</td></tr><tr style="height: 40px;"><td style="word-wrap: break-word; font-size: 14px; height: 14px; vertical-align: top;">形象的比如:</td></tr><tr style="height: 40px;"><td style="word-wrap: break-word; font-size: 14px; height: 14px; vertical-align: top;">子弹沿着枪管发射，才有威力！<br /> <br />指针就像子弹,函数就像枪管，指针沿着枪管发射出去，才能显示它的威力。。。。。。<br />我们的研究方向。。。。。。（你明白了?）</td></tr></tbody></table><br /><br /><br /><span style="font-family: Arial; background-color: #ffffff;"><strong><span style="color: #ff0000;">铁律3：理解指针必须和内存四区概念相结合&nbsp;</span></strong></span><br style="font-family: Arial; background-color: #ffffff;" /><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">1）主调函数&nbsp;被调函数&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a)&nbsp;主调函数可把堆区、栈区、全局数据内存地址传给被调用函数&nbsp;<br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b)&nbsp;被调用函数只能返回堆区、全局数据&nbsp;<br /></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">2）内存分配方式</p><span style="font-family: Arial; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; a)&nbsp;指针做函数参数，是有输入和输出特性的。</span><br /></div><div yne-bulb-block="paragraph" style="white-space: pre-wrap; line-height: 1.75;">&nbsp;</div><img src ="http://www.cppblog.com/silvercell/aggbug/215092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-12 17:49 <a href="http://www.cppblog.com/silvercell/articles/215092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>003 memory div 4 model   and  call function model</title><link>http://www.cppblog.com/silvercell/articles/215084.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Tue, 11 Jul 2017 04:21:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215084.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215084.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215084.html</trackback:ping><description><![CDATA[<br /><br /><strong>why learn ?</strong><br /><ul><li>the variable 's lifetime</li><li>the stream to call the func</li></ul><br /><strong><br />how c program run</strong><br /><ol><li>os load the program into the memory</li><li>c language div the memory to 4 piece (heap stack global codes)</li><li>find the door main() and execute&nbsp;</li></ol><br /><strong>global division<br />全局区的理解:<br /></strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&nbsp;&nbsp;&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br /><br /><span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;getstr1()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;"hello";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br />}&nbsp;<br /><span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;getstr2()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;q&nbsp;=&nbsp;"hello";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;q;&nbsp;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;*&nbsp;argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;a&nbsp;= NULL;<br />&nbsp; &nbsp; a = &nbsp;getstr1();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;b&nbsp;=&nbsp;NULL;<br />&nbsp; &nbsp; b = getstr2();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%#p:%s,&nbsp;%#p:%s",&nbsp;a,a,b,b);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><div></div><img src="http://www.cppblog.com/images/cppblog_com/silvercell/%E6%8C%87%E9%92%88%E6%8C%87%E5%90%91%E8%B0%81%E5%B0%B1%E6%8A%8A%E8%B0%81%E7%9A%84%E5%9C%B0%E5%9D%80%E8%B5%8B%E5%80%BC%E7%BB%99%E6%8C%87%E9%92%88.png" width="1176" height="502" alt="" /><br />-----<br /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/silvercell/指针变量和它指向的内存空间是不同的.png" width="1176" height="502" alt="" /><br /><br /><br />----<br /><br /><br />编译器优化代码 一个字符串常量 在常量区存在相同的 则会指向相同的地址相同的值<br /><br /><br /><br /><strong>堆、栈区的理解</strong><br /><br />画图分析为什么这样传参数不对？？？：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;getstr()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[20];<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(buf,"hello");&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;buf;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;getstr();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><strong><br />指针是基于内存</strong>&nbsp;存储的是内存的地址编号。<br />对内存的深刻学习，知道内存是在哪分配的。<br /><br /><br /><strong>栈的开口方向</strong><br /><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;main()</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;a&nbsp;=&nbsp;10;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&nbsp;b&nbsp;=&nbsp;3;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;printf("%#p\n%#p"&nbsp;,&nbsp;&amp;a&nbsp;,&nbsp;&amp;b);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">return</span><span style="font-size: 13px;">&nbsp;0;</span><br /><span style="font-size: 13px;">}</span><br /><div><span style="font-size: 13px;">0X000000000062FE4C</span></div><div><span style="font-size: 13px;">0X000000000062FE48</span></div></div><br /><br /><strong>buf[20] 的内存增长方向</strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[20];<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("\n%#p&nbsp;\n%#p&nbsp;\n%#p"&nbsp;,&nbsp;&amp;buf[0]&nbsp;,&nbsp;&amp;buf[1]&nbsp;,&nbsp;&amp;buf[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div>栈是静态编译 ； 编译器编译期间， 扫描代码期间已经确定下 buf 所代表的内存空间标号 。<br /><br /><br />函数的执行过程<br /><img src="http://www.cppblog.com/images/cppblog_com/silvercell/函数的入栈和出栈过程.PNG" width="255" height="388" alt="" /><br /><br /><br />函数调用<br />----<br /><img src="http://www.cppblog.com/images/cppblog_com/silvercell/函数调用图png.png" width="1176" height="502" alt="" /><br /><br />----<br />内存的使用范围:&nbsp;<br /><br />main() 函数可以在堆栈和全局区上分配内存 fa() fb() 可以使用因为 mian() 函数执行没有结束。<br /><br />在 fa() fb() 中申请的内存 main() &nbsp;不一定可以使用。<br />&nbsp; &nbsp;fa（） fb() 在 栈上 分配 则函数结束后消失。<br />&nbsp; &nbsp;fb() 中全局区的常量字符串可以被 main() &nbsp;fa() 使用<br />----<br /><br />一个 main() 函数执行 多次调用函数&nbsp;<br />c/c++ 编译器只创建一个内存四区<br /><br />返回地址是在函数调用其它函数时候记录函数执行到哪一行，当其他函数执行之后 ，继续从这一行开始向下执行函数。<br /><br /><strong><br />指针是数据类型:</strong><br />*p 进行定位内存空间 ： 可以进行 <u>读写&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/silvercell/不断地给指针变量赋值改变指针的指向.png" width="1176" height="502" alt="" /><br /></u>----&nbsp;<br />常量区不能被修改<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;getstr()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*p&nbsp;=&nbsp;NULL;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;"admin";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;getstr();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;*(p+2)&nbsp;=&nbsp;'M';&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">挂了</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><u style="font-size: 14pt;"><strong>指针也是一种数据类型</strong></u><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><span style="color: #0000ff;">指针做函数参数:<br /><br />int</span>&nbsp;getA1(<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;p1);<br /><span style="color: #0000FF; ">int</span>&nbsp;getA2(<span style="color: #0000FF; ">char</span>&nbsp;**p2);<br /><span style="color: #0000FF; ">int</span>&nbsp;getA3(<span style="color: #0000FF; ">char</span>&nbsp;***p3);<br /><span style="color: #0000FF; ">int</span>&nbsp;getA4(<span style="color: #0000FF; ">char</span>&nbsp;(*p4)[30]);<br /><span style="color: #0000FF; ">int</span>&nbsp;getA5(<span style="color: #0000FF; ">char</span>&nbsp;p5[10][30]);</div><br />在编译器上，都只会分配一个 指针类型变量的空间 &nbsp;4B（sys32 platform）<br />使用的时候根据业务逻辑来真正当作 一维二维三维指针<br /><br /><div yne-bulb-block="paragraph" style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; background-color: #ffffff; white-space: pre-wrap; line-height: 1.75;"><span style="box-sizing: border-box; font-size: 16px; font-family: SimSun, STSong;"><u>指针是一种数据类型，是指它指向的内存空间的数据类型</u></span></div><div yne-bulb-block="paragraph" style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; background-color: #ffffff; white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="box-sizing: border-box; font-family: SimSun, STSong;">含义</span><span style="box-sizing: border-box; font-family: SimSun, STSong;">1</span><span style="box-sizing: border-box; font-family: SimSun, STSong;">：指针步长（</span><span style="box-sizing: border-box; font-family: Calibri;">p++</span><span style="box-sizing: border-box; font-family: SimSun, STSong;">），根据所致内存空间的数据类型来确定</span></div><div yne-bulb-block="paragraph" style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; background-color: #ffffff; white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="box-sizing: border-box; font-family: SimSun, STSong;">p++=</span>&#232;<span style="box-sizing: border-box; font-family: SimSun, STSong;">(unsigned char )p+sizeof(a);</span></div><div yne-bulb-block="paragraph" style="box-sizing: border-box; color: #4b4b4b; font-family: verdana, Arial, helvetica, sans-seriff; font-size: 13px; background-color: #ffffff; white-space: pre-wrap; text-indent: 28px; line-height: 1.75;"><span style="box-sizing: border-box; font-family: SimSun, STSong;">结论：指针的步长，根据所指内存空间类型来定</span></div><img src ="http://www.cppblog.com/silvercell/aggbug/215084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-11 12:21 <a href="http://www.cppblog.com/silvercell/articles/215084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>002 before memory div 4  the essence  of   datatype and variable</title><link>http://www.cppblog.com/silvercell/articles/215083.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Tue, 11 Jul 2017 04:15:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215083.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215083.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215083.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215083.html</trackback:ping><description><![CDATA[<strong>数据类型的本质<br /></strong>&nbsp; &nbsp;<span style="color: red;">固定大小内存块的别名</span><br /><br />different type of data<br /><div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; width: 1098.58px; word-break: break-all;"><span style="color: #0000ff;">int</span>&nbsp;main(<span style="color: #0000ff;">int</span>&nbsp;argc,&nbsp;<span style="color: #0000ff;">char</span>&nbsp;*&nbsp;*&nbsp;argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span>&nbsp;b[10];<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("b:&nbsp;%d&nbsp;,&nbsp;b+1:&nbsp;%d&nbsp;,&nbsp;&amp;b:&nbsp;%d&nbsp;,&nbsp;&amp;b+1:&nbsp;%d"&nbsp;,b,&nbsp;b+1&nbsp;,&amp;b&nbsp;,&nbsp;&amp;b+1);<br /><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;b:&nbsp;6487584&nbsp;,&nbsp;b+1:&nbsp;6487588&nbsp;,&nbsp;&amp;b:&nbsp;6487584&nbsp;,&nbsp;&amp;b+1:&nbsp;6487624</span><span style="color: #008000;"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span>&nbsp;0;<br />}</div><br /><br />calculate the sizeof data<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">sizeof</span>&nbsp;</div><br /><br />typedef define data &nbsp;simple and complex<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Teacher{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;name[100];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;project[20];<br />}tec;<br /><br />typedef&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sys32int;</div><br /><br />package the data<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><span style="color: #0000ff;">int</span>&nbsp;socketclient_init(<span style="color: #0000FF; ">void</span>&nbsp;**&nbsp;handle)<br /><br />【memcpy &amp; memset】<br />void * memcpy(void * dest , const void * src , size_t len);<br />void * memset(void * buf , int c , size_t num);</div><br /><br />the void use&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;p&nbsp;=&nbsp;NULL;<br />p&nbsp;=&nbsp;(char *)malloc(100);<br /><br />malloc 返回类型 &nbsp;void *&nbsp;<br />char *p = (char *)malloc(100);</div><br /><strong><br /><br />变量的本质</strong><br />&nbsp;&nbsp;&nbsp;<span style="color: red;">连续的内存空间的别名。门牌号。<br /></span><br />&nbsp; &nbsp;内存有地址编号，拿到地址编号也可以修改内存。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main()<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;12;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;:&nbsp;"&nbsp;,&nbsp;&amp;a);&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n"&nbsp;,&nbsp;a);<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&amp;a&nbsp;:&nbsp;6487628</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((<span style="color: #0000FF; ">int</span>&nbsp;*)6487628&nbsp;)&nbsp;=&nbsp;10;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #008000;">//&nbsp;</span><span style="color: #008000;">*((int *)&amp;a ) = 10;</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;:&nbsp;"&nbsp;,&nbsp;&amp;a);&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d"&nbsp;,&nbsp;a);<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">6487628&nbsp;:&nbsp;12<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">6487628&nbsp;:&nbsp;10</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span>}</div><br /><br /><br />变量 ： 名称 大小 作用域<br /><br />变量的生命周期？<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 内存四区模型 ， 函数调用模型<br /><br /><img src ="http://www.cppblog.com/silvercell/aggbug/215083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-11 12:15 <a href="http://www.cppblog.com/silvercell/articles/215083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>001 c basic and knowledgetables</title><link>http://www.cppblog.com/silvercell/articles/215081.html</link><dc:creator>silvercell</dc:creator><author>silvercell</author><pubDate>Tue, 11 Jul 2017 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/silvercell/articles/215081.html</guid><wfw:comment>http://www.cppblog.com/silvercell/comments/215081.html</wfw:comment><comments>http://www.cppblog.com/silvercell/articles/215081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silvercell/comments/commentRss/215081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silvercell/services/trackbacks/215081.html</trackback:ping><description><![CDATA[<div><div><br /><br />数据结构:<br /><ul><li>链表</li><li>队列 栈</li><li>树 二叉树</li><li>&nbsp; &nbsp; &nbsp; ...</li></ul></div><br />dev in diff platform<br /><ul><li>win_c</li><li>inux_c</li></ul><br />think mode &nbsp;&nbsp;<br /><ul><li>API 抽象</li><li>模块化编程</li><li>拆分断层思维</li></ul><br />protocol:<br /><ul><li>BS: http https</li><li>CS: tcp / udp &nbsp;ip</li></ul><br /><br />client / server API<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;application &nbsp; (A)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_________ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/ &nbsp; &nbsp;server<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket &nbsp; &nbsp; &nbsp; &nbsp; (B)<br /><br />&nbsp; &nbsp; &nbsp; A -&gt; B &nbsp;-&gt; B实现通信功能<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;快速的实现: API 的使用 查找 实现<br /><ul><li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一级二级指针</li><li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void ** p 无类型的封装</li><li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数组作为函数参数和指针的关系: 等同 ， 原因: 直接操作内存， 提高效率</li><li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 函数形参在函数参数表中和函数体中的类型等价</li></ul><br /><br /></div><img src ="http://www.cppblog.com/silvercell/aggbug/215081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silvercell/" target="_blank">silvercell</a> 2017-07-11 10:58 <a href="http://www.cppblog.com/silvercell/articles/215081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>