📄 第21章 指针三 实例演练与提高.htm
字号:
<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 < 10; ++i)</SPAN>
<P><SPAN lang=en-us>{</SPAN>
<P><SPAN lang=en-us> 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> <SPAN lang=en-us>//</SPAN>定义一个指针数组,可以存放10个<SPAN
lang=en-us>int </SPAN>型指针
<P> int *p[10];
<P>
<P><SPAN lang=en-us> //</SPAN>循环,为每个指针各分配空间。
<P> for(int i=0; i<10; ++i)
<P> {
<P> p[i] = new int [5];<SPAN
lang=en-us> //</SPAN>分配5个元素的空间
<P><SPAN lang=en-us> </SPAN>
<P><SPAN lang=en-us>
//</SPAN>然后为当前指针中每个元素赋值:<SPAN lang=en-us> </SPAN>
<P> for (int j = 0; j<5; ++j)
<P> p[i][j] = j;
<P> }<BR> <SPAN lang=en-us> </SPAN>
<P><SPAN lang=en-us> //</SPAN>输出每个指针中每个元素(用了两个“每”,所以需要两层循环)
<P> for(int i=0; i<10; ++i)
<P> {
<P> for (int j = 0; j<5; ++j)
<P> cout << p[i][j]
<< ",";
<P> cout <<
endl;<BR> }
<P>
<P><SPAN lang=en-us> //</SPAN>重要!!!最后也要分别释放每个指针
<P> for(int i=0; i<10; ++i)
<P> delete [] p[i];<BR>
<P> system("Pause");
<P> return 0;<BR> }
<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> <SPAN lang=en-us>//</SPAN>定义一个指针数组,可以存放10个<SPAN
lang=en-us>int </SPAN>型指针
<P> int *p[10];
<P>
<P><SPAN lang=en-us> //</SPAN>循环,为每个指针各分配空间。
<P> for(int i=0; i<10; ++i)
<P> {
<P> p[i] = new int [<B><FONT
color=#ff0000><SPAN lang=en-us>i+1</SPAN></FONT></B>];<SPAN
lang=en-us> //</SPAN>分配<SPAN lang=en-us>i</SPAN>+1个元素的空间
<P><SPAN lang=en-us> </SPAN>
<P><SPAN lang=en-us>
//</SPAN>然后为当前指针中每个元素赋值:<SPAN lang=en-us> </SPAN>
<P> for (int j = 0; j<<B><FONT
color=#ff0000>i+1</FONT></B>; ++j)
<P> p[i][j] = j;
<P> }<BR> <SPAN lang=en-us> </SPAN>
<P><SPAN lang=en-us> //</SPAN>输出每个指针中每个元素
<P> for(int i=0; i<10; ++i)
<P> {
<P> for (int j = 0; j<<FONT
color=#ff0000><B>i+1</B>;</FONT> ++j)
<P> cout << p[i][j]
<< ",";
<P> cout <<
endl;<BR> }
<P>
<P><SPAN lang=en-us> //</SPAN>重要!!!最后也要分别释放每个指针
<P> for(int i=0; i<10; ++i)
<P> delete [] p[i];<BR>
<P> system("Pause");
<P> return 0;<BR> }
<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> {"</SPAN>郭靖<SPAN lang=en-us>"},</SPAN>
<P><SPAN lang=en-us> {"</SPAN>李小龙<SPAN lang=en-us>"},</SPAN>
<P><SPAN lang=en-us> {"</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> {"</SPAN>郭靖<SPAN lang=en-us>"},</SPAN>
<P><SPAN lang=en-us> {"</SPAN>李小龙<SPAN lang=en-us>"},</SPAN>
<P><SPAN lang=en-us> {"</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> {"</SPAN>郭靖<SPAN lang=en-us>"},</SPAN>
<P><SPAN lang=en-us> {"</SPAN>李小龙<SPAN lang=en-us>"},</SPAN>
<P><SPAN lang=en-us> {"</SPAN>施瓦辛格<SPAN lang=en-us>"},</SPAN>
<P> {<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: ËÎÌå"
width="100%" height=37> </TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -