⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第21章 指针三 实例演练与提高.htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <P><SPAN lang=en-us>char* name2 = "</SPAN>张三<SPAN lang=en-us>";</SPAN> 
      <P>  
      <P><SPAN lang=en-us>strcpy (name1, name2);</SPAN> 
      <P>  
      <P>现在<SPAN lang=en-us>name1 </SPAN>的内容也是“张三”。 
      <P>  
      <H3><SPAN lang=en-us><A name=21.6>21.6</A> </SPAN><B>指</B>针数组</H3>
      <P><SPAN lang=zh-cn>学过数组,指针,二者结合起来,指什么?</SPAN></P>
      <H4>21.6.1 什么叫“指针数组”?</H4>
      <P>一个数组用来存放整型数,我们就叫它 整型数组或整数数组; 
      <P>一个数组用来存入字符,就叫字符数组; 
      <P>同样,一个数组用来存入指针,那就叫指针数组。 
      <P>  
      <P>比如: 
      <P><SPAN lang=en-us>int* p; </SPAN>这只是一个指针<SPAN lang=en-us>.</SPAN> 
      <P>而 
      <P><SPAN lang=en-us>int* p[10]; </SPAN>这是一个数组,里头存放了10个指针。 
      <P>  
      <P>请大家区分: 
      <P><SPAN lang=en-us>int* p = new int[10];</SPAN> 
      <P>和 
      <P><SPAN lang=en-us>int* pa[10];</SPAN> 
      <P>前者,是一个指针,并且该指针分配了10个元素的空间。 
      <P>而后者,则是一个指针数组,用于存放10个指针<SPAN 
      lang=en-us>(pa[0],pa[1]...pa[9]</SPAN>都是指针<SPAN 
      lang=en-us>)</SPAN>,这10个指针都可以分配10个元素(也可以不是10个,比如是8个或11个)。 
      <P>  
      <P>仍然以建筑来比喻: 
      <P>  
      <P><SPAN lang=en-us>int* p = new int[10]; </SPAN>
      <P><SPAN lang=en-us>p </SPAN>是<SPAN lang=en-us> </SPAN>一张(是的一张而已)图纸,<SPAN 
      lang=en-us>new int[10]</SPAN> 是 我们根据它建了10间房子。 
      <P>  
      <P><SPAN lang=en-us>int* pa[10];</SPAN> 
      <P><SPAN lang=en-us>pa[10]</SPAN> 是10张图纸。至于这10图纸上各准备建多少间房子,我们暂未定下。 
      <P>  
      <P>我们可以通过一个循环,来为<SPAN lang=en-us>pa[10]</SPAN>中的每个指针分配8个元素的空间。 
      <P><SPAN lang=en-us>for (int i=0; i &lt; 10; ++i)</SPAN> 
      <P><SPAN lang=en-us>{</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; pa[i] = new int [8]; 
      //</SPAN>为每个指针都分配8个<SPAN lang=en-us>int</SPAN>元素空间。 
      <P><SPAN lang=en-us>}</SPAN> 
      <P>  
      <H4><A name=21.6.2>21.6<SPAN lang=en-us>.2</SPAN></A> 指针数组实例一</H4>
      <P>  
      <P>请打CB,并新建一个控制台工程(记得在出现的对话框中选中“C++选项”)。 
      <P>然后输入以下代码(部分代码是CB自动生成的,你不必加入): 
      <P>  
      <P>//--------------------------------------------------------------------------- 

      <P>#pragma argsused 
      <P>int main(int argc, char* argv[]) 
      <P>{ 
      <P>&nbsp;&nbsp; <SPAN lang=en-us>//</SPAN>定义一个指针数组,可以存放10个<SPAN 
      lang=en-us>int </SPAN>型指针 
      <P>&nbsp;&nbsp; int *p[10]; 
      <P>  
      <P><SPAN lang=en-us>&nbsp;&nbsp; //</SPAN>循环,为每个指针各分配空间。 
      <P>&nbsp;&nbsp; for(int i=0; i&lt;10; ++i) 
      <P>&nbsp;&nbsp; { 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[i] = new int [5];<SPAN 
      lang=en-us>&nbsp;&nbsp; //</SPAN>分配5个元素的空间 
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //</SPAN>然后为当前指针中每个元素赋值:<SPAN lang=en-us> </SPAN>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j&lt;5; ++j) 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[i][j] =&nbsp; j; 
      <P>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; <SPAN lang=en-us>&nbsp; </SPAN>
      <P><SPAN lang=en-us>&nbsp; //</SPAN>输出每个指针中每个元素(用了两个“每”,所以需要两层循环) 
      <P>&nbsp; for(int i=0; i&lt;10; ++i) 
      <P>&nbsp; { 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j&lt;5; ++j) 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; p[i][j] 
      &lt;&lt; ","; 
      <P>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; 
      endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; } 
      <P>  
      <P><SPAN lang=en-us>&nbsp; //</SPAN>重要!!!最后也要分别释放每个指针 
      <P>&nbsp; for(int i=0; i&lt;10; ++i) 
      <P>&nbsp;&nbsp;&nbsp; delete [] p[i];<BR>  
      <P>&nbsp; system("Pause"); 
      <P>&nbsp; return 0;<BR>&nbsp;&nbsp; } 
      <P>//---------------------------------------------------------------------------<BR>  

      <P>本例的输出为: 
      <P align=center><IMG height=174 src="第21章 指针三 实例演练与提高.files/ls21.h1.gif" 
      width=121 border=0> 
      <P>  
      <H4><SPAN lang=en-us><A name=21.6.3>21.6.3</A> </SPAN>指针数组实例二</H4>
      <P>本例对上例做一些小小改动: 
      <P>  
      <P>//--------------------------------------------------------------------------- 

      <P>#pragma argsused 
      <P>int main(int argc, char* argv[]) 
      <P>{ 
      <P>&nbsp;&nbsp; <SPAN lang=en-us>//</SPAN>定义一个指针数组,可以存放10个<SPAN 
      lang=en-us>int </SPAN>型指针 
      <P>&nbsp;&nbsp; int *p[10]; 
      <P>  
      <P><SPAN lang=en-us>&nbsp;&nbsp; //</SPAN>循环,为每个指针各分配空间。 
      <P>&nbsp;&nbsp; for(int i=0; i&lt;10; ++i) 
      <P>&nbsp;&nbsp; { 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[i] = new int [<B><FONT 
      color=#ff0000><SPAN lang=en-us>i+1</SPAN></FONT></B>];<SPAN 
      lang=en-us>&nbsp;&nbsp; //</SPAN>分配<SPAN lang=en-us>i</SPAN>+1个元素的空间 
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //</SPAN>然后为当前指针中每个元素赋值:<SPAN lang=en-us> </SPAN>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j&lt;<B><FONT 
      color=#ff0000>i+1</FONT></B>; ++j) 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[i][j] = j; 
      <P>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; <SPAN lang=en-us>&nbsp; </SPAN>
      <P><SPAN lang=en-us>&nbsp; //</SPAN>输出每个指针中每个元素 
      <P>&nbsp; for(int i=0; i&lt;10; ++i) 
      <P>&nbsp; { 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j&lt;<FONT 
      color=#ff0000><B>i+1</B>;</FONT> ++j) 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; p[i][j] 
      &lt;&lt; ","; 
      <P>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; 
      endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; } 
      <P>  
      <P><SPAN lang=en-us>&nbsp; //</SPAN>重要!!!最后也要分别释放每个指针 
      <P>&nbsp; for(int i=0; i&lt;10; ++i) 
      <P>&nbsp;&nbsp;&nbsp; delete [] p[i];<BR>  
      <P>&nbsp; system("Pause"); 
      <P>&nbsp; return 0;<BR>&nbsp;&nbsp; } 
      <P>//---------------------------------------------------------------------------<BR>  

      <P>本例的输出为: 
      <P align=center><IMG height=179 src="第21章 指针三 实例演练与提高.files/ls21.h2.gif" 
      width=164 border=0> 
      <P>  
      <H4><SPAN lang=en-us><A name=21.6.4>21.6.4</A> </SPAN>字符串指针数组</H4>
      <P>假设我们想在程序中加入某个班级的花名册。让我们来想想如何实现。 
      <P>由于一个人名由多个字符组成,所以人名就是一个数组。而全班人名,就是数组的数组,因此可以用二维数组来实现。 
      <P>假设本班只有3个学员,每个学员的人名最长不超过4个汉字<SPAN 
      lang=en-us>,</SPAN>每个汉字占2个字符,加上最后1个固定的结束符,共9个字符来表示一个人名。 
      <P>  
      <P><SPAN lang=en-us>char names[</SPAN>3<SPAN lang=en-us>][9] =</SPAN> 
      <P><SPAN lang=en-us>{</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>郭靖<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>李小龙<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>施瓦辛格<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>};</SPAN> 
      <P>  
      <P>这是个不错的解决方案。惟一稍有一点不足的是,我们为每个学员分配长9个字符,其实像1号郭靖,他只需5个字符就足矣。但我们使用“二维数组”的方案无法为不同长度的姓名分配不同的空间。 

      <P>  
      <P>这时候,就可以用字符串指针数组了!“锵锵锵”,我们让字符串指针数组的方案出场。 
      <P>  
      <P><SPAN lang=en-us>char* names[</SPAN>3<SPAN lang=en-us>] =</SPAN> 
      <P><SPAN lang=en-us>{</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>郭靖<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>李小龙<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>施瓦辛格<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>};</SPAN> 
      <P>  
      <P>变化并不多,但是学杂费空间的问题却得到了解决。更为美妙的是,就算现在新来一位大侠叫“无敌鸳鸯腿”,我们也可以从容处理: 
      <P><SPAN lang=en-us>char* names[</SPAN>4<SPAN lang=en-us>] =</SPAN> 
      <P><SPAN lang=en-us>{</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>郭靖<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>李小龙<SPAN lang=en-us>"},</SPAN> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; {"</SPAN>施瓦辛格<SPAN lang=en-us>"},</SPAN> 
      <P>&nbsp;&nbsp; {<SPAN lang=en-us>"</SPAN>无敌鸳鸯腿<SPAN lang=en-us>"},</SPAN> 

      <P><SPAN lang=en-us>};</SPAN> 
      <P>  
      <P>接下来,我们来对“小王成绩管理<SPAN lang=en-us>V2.0</SPAN>”系统做另一种改进。 
      <P>  
      <P><B>此次改进并不要求可以动态输入学校学生的总数。相反,作来一种“定制版”,我们希望专门为某个学校加入花名册功能<SPAN 
      lang=en-us>,</SPAN>希望在录入成绩时,可以增加显示该学生的姓名。</B> 
      <P><B>假设这个学校叫“精武文武学校”,并暂定本期学员也只有上述那4位。</B> 
      <P>  
      <P><SPAN lang=en-us>"</SPAN>精武馆定制版的小王成绩管理系统<SPAN 
      lang=en-us>"</SPAN>如何实现?呵,我不写了,大家写吧。题目条件就是上面的黑体部分。最终录入界面应类似于: 
      <P align=center><IMG height=56 src="第21章 指针三 实例演练与提高.files/ls21.h3.gif" 
      width=125 border=0> 
      <P>  
      <P>快点开始做吧,把你的作业发在BBS里,让我评评你的成绩是多少<SPAN lang=en-us> :)))) ?</SPAN> 
      <P> </P></TD></TR>
  <TR>
    <TD 
    style="FONT-SIZE: 10pt; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; FONT-FAMILY: &Euml;&Icirc;&Igrave;&aring;" 
    width="100%" height=37> </TD></TR></TBODY></TABLE></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -