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

📄 教学--第十七章 数组(二).htm

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      lang=en-us>{1,2,3,4,5,6};</SPAN>
      <P><SPAN lang=zh-cn>红色部分告诉编译器,这是一个一维数组。对于二维数组:</SPAN>
      <P><SPAN lang=en-us>int <FONT color=#ff0000>arr[][3]</FONT> = 
      {1,2,3,4,5,6};</SPAN>
      <P><SPAN 
      lang=zh-cn>红色部分告诉编译器,这是一个二维数组,并且低维尺寸为3个,也就是要按每3个元素分出一行。C++的语法规定,编译器首先查看低维大小,所以我们若没有指明低维大小,则编译器立即报错,停止干活。因此,定义:</SPAN>
      <P>int arr[2][] = {1,2,3,4,5,6};<SPAN lang=zh-cn> 是一种错误。</SPAN>
      <P> 
      <H4><B><A name=17.2.4>17.2.4</A> 二维数组的内存<SPAN 
lang=zh-cn>地址</SPAN></B></H4>
      <P> 
      <P><SPAN 
      lang=zh-cn>了解了二维数组的内存结构,我们再来说说几个关于二维数组地址问题,会有些绕,但并不难。嗯,先来做一个智力测试。</SPAN>
      <P><SPAN lang=zh-cn>以下图形中包含几个三角形</SPAN>?
      <P align=center><IMG height=85 src="教学--第十七章 数组(二).files/ls17.h3.gif" 
      width=212 border=0>
      <P> 
      <P><SPAN lang=zh-cn>正确答案是:3个。想必没有人答不出。我们要说的是 
      :这三个三角形中,两个小三角和一个大三角重叠着,因此若计算面积,则面积并非三个三角形的和,而是两个小三角或一个大三角的面积。</SPAN>
      <P> 
      <P><SPAN 
      lang=zh-cn>这个问题我们在一维数组时已经碰到过:一个数组本身可称为一个变量,而它包含的各个元素也都是一个个变量,但它们占用的内存是重叠的。</SPAN>
      <P> 
      <P><SPAN 
      lang=zh-cn>二维数组本身也是一个变量,并且也直接代表该数组的地址,我们要得到一个二维数组变量的地址,同样不需要取址符:</SPAN>&amp;<SPAN 
      lang=zh-cn>。</SPAN>
      <P> 
      <P>int arr[2][3] = {1,2,3,4,5,6};
      <P> 
      <P>//<SPAN lang=zh-cn>输出整个二维数组的地址。</SPAN>
      <P>cout &lt;&lt; arr;&nbsp; 
      <P> 
      <P><SPAN lang=zh-cn>同样,我们也可以得到每个元素的地址,不过需要使用取址符:</SPAN>
      <P> 
      <P>//<SPAN lang=zh-cn>输出第一个元素(第0行第0列)的地址:</SPAN>
      <P>cout &lt;&lt; &amp;arr[0][0] &lt;&lt; endl;&nbsp;&nbsp; 
      <P><SPAN lang=zh-cn>//输出第2行第3列的元素地址:</SPAN>
      <P>cout &lt;&lt; &amp;arr[1][2] &lt;&lt; endl;<SPAN 
      lang=zh-cn>&nbsp;&nbsp; </SPAN>
      <P> 
      <P><SPAN lang=zh-cn>除此之外,我们还可以按“行”来输出元素地址</SPAN>,<SPAN 
      lang=zh-cn>不需要使用取址符:</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>//输出第一行元素的起始地址:</SPAN>
      <P>cout &lt;&lt; arr[0] &lt;&lt; endl;
      <P><SPAN lang=zh-cn>//输出第二行元素的起始地址:</SPAN>
      <P>cout &lt;&lt; arr[1] &lt;&lt; endl;
      <P> 
      <P><IMG height=180 src="教学--第十七章 数组(二).files/tmp.gif" width=449 border=0>
      <P> 
      <P><SPAN lang=zh-cn>上图表明:</SPAN>arr, arr[0], &amp;arr[0][0] <SPAN 
      lang=zh-cn>都指向了同一内存地址。即:</SPAN> arr == arr[0] == &amp;arr[0][0]<SPAN 
      lang=zh-cn>。</SPAN>
      <P><SPAN lang=zh-cn>另外:</SPAN> arr[1] == &amp;arr[1][0] <SPAN 
      lang=zh-cn>及</SPAN>&nbsp; arr[2] == &amp;arr[2][0]。
      <P> 
      <P>我们可以有这些推论: 
      <B>二维数组中的每一行,相当于一个一维数组。</B>或者说,一维数组是由多个简单变量组成,而二维数组是由多个一维数组组成。
      <P>示意图:
      <P align=center><IMG height=210 src="教学--第十七章 数组(二).files/arr21.gif" 
      width=306 border=0>
      <P align=center>(<A name=二维数组包含一维数组>二维数组包含一维数组</A>)
      <P>例子:
      <P><SPAN lang=en-us>int arr[2][3];</SPAN>
      <P>则:<SPAN lang=en-us> arr[i][j] </SPAN>相当于一个普通<SPAN 
      lang=en-us>int</SPAN>变量。而<SPAN lang=en-us> arr[i] </SPAN>相当于一个一维数组。
      <P> 
      <P><SPAN lang=zh-cn>现在,我还是来提问两个问题:</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>问题一:</SPAN>
      <P><SPAN lang=zh-cn>有一数组</SPAN> char arr[3][4];
      <P><SPAN lang=zh-cn>已知</SPAN> arr <SPAN 
      lang=zh-cn>中第一个元素</SPAN>(arr[0][0])<SPAN 
      lang=zh-cn>的地址为:</SPAN>10000,<SPAN lang=zh-cn>请问</SPAN> &amp;arr[2][1] 
      <SPAN lang=zh-cn>的值为?</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>解答:先要知道</SPAN>arr[1][1]<SPAN 
      lang=zh-cn>是数组</SPAN>arr<SPAN lang=zh-cn>中的第几个元素?</SPAN> <SPAN 
      lang=zh-cn>数组</SPAN>arr<SPAN lang=zh-cn>共3行,每行4列,而</SPAN>arr[2][1]<SPAN 
      lang=zh-cn>是位于第3行第2列,所以它是第: </SPAN>2 * 4 + 2 = 1<SPAN 
      lang=zh-cn>0,即第10个元素。</SPAN>
      <P><SPAN lang=zh-cn>这样就计算出来,第</SPAN>1<SPAN 
      lang=zh-cn>个元素地址是10000,则第10个元素地址:</SPAN> 10000 + (10 - 1)&nbsp; * 
      sizeof(char) = 10009<SPAN lang=zh-cn>。</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>问题二:</SPAN>
      <P><SPAN lang=zh-cn>如果上题中的数组为:</SPAN> int arr[3][4];<SPAN 
      lang=zh-cn>其余不变,请问该如何计算?</SPAN>
      <P><SPAN lang=zh-cn>答案:</SPAN>10000 + (10 - 1)&nbsp; * sizeof(int) = 
      10036<SPAN lang=zh-cn>。</SPAN>
      <P> 
      <H3><B><A name=17.3>17.3</A> 二维数组实例</B></H3>
      <P>是不是前面的内容让你有些发晕。知识重在应用。我们还是来多操练几个二维数组的例子吧。但是,等用得多了,用得熟了,我希望大家回头再看前面的那些内容。
      <P> 
      <H4><A name=17.3.1>17.3.1</A> <SPAN lang=zh-cn>用二维数组做字模</SPAN></H4>
      <P> 
      <P><B>例三:</B> 字模程序。
      <P> 
      <P>手机屏幕是如何显示英文字母或汉字的?这个小程序将要从原理上模拟这个过程。
      <P> 
      <P>手机屏幕采用的字体称为“点阵”字体。所以“点阵”,就是用一个个小点,通过“布阵”,组成一个字形。而这些点阵数据,就是一个二维数组中的元素。不同的手机,点阵的大小也不同。如果不支持中文,则最小只需7*7;但若是要支持汉字,则应不小于9*9,否则许多汉字会缺横少竖。采用大点阵字体,则手机屏幕要么是面积更大,要么是分辨率更高(同一面积内可以显示更多点);并且手机的内部存储器也要更多。由于汉字数量众多,不像英文主要只有26个字母;所以支持汉字的手机,比只能显示英文字手机,其所需存储器自然要多出一个很大的数量级。
      <P> 
      <P>下面举例英文字母“A"的点阵,为了看的方便,我们用*来代替小黑点,并且打上了表格。我们使用最小的7*7点阵:
      <P> 
      <DIV align=center>
      <CENTER>
      <TABLE id=AutoNumber11 style="TEXT-INDENT: 0px; BORDER-COLLAPSE: collapse" 
      borderColor=#c0c0c0 height=138 cellSpacing=0 cellPadding=0 width="20%" 
      border=1>
        <TBODY>
        <TR>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD></TR>
        <TR>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD></TR>
        <TR>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="15%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD></TR>
        <TR>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="15%" height=19>*</TD>
          <TD align=middle width="15%" height=19> </TD></TR>
        <TR>
          <TD align=middle width="14%" height=19>*</TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD>
          <TD align=middle width="15%" height=19>*</TD></TR>
        <TR>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="14%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD>
          <TD align=middle width="15%" height=19> </TD></TR>
        <TR>
          <TD align=middle width="14%" height=18></TD>
          <TD align=middle width="14%" height=18></TD>
          <TD align=middle width="14%" height=18></TD>
          <TD align=middle width="14%" height=18></TD>
          <TD align=middle width="14%" height=18></TD>
          <TD align=middle width="15%" height=18></TD>
          <TD align=middle width="15%" 
      height=18></TD></TR></TBODY></TABLE></CENTER></DIV>
      <P> 
      <P>对于这样一个点阵,对应一个二维数组为:
      <P> 
      <P><SPAN lang=en-us>int A[7][7] = </SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,0,0,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,1,0,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,1,0,1,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,1,1,1,1,1,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {1,0,0,0,0,0,1},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,0,0,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,0,0,0,0},</SPAN>
      <P><SPAN lang=en-us>};</SPAN>
      <P> 
      <P>程序要在屏幕上打出“A"时,则只需遍历该数组,然后在元素值为0的地方,打出空格,在元素值为1的地方,打出小点即可。当然,在我们的模拟程序里,我们打出星号。
      <P>所有这些数组,都需要事先写到手机的固定存储器中,这些数据就称为“字模”。
      <P> 
      <P>对于“A"的例子,打印时的代码如下:
      <P> 
      <P><SPAN lang=en-us>for(int row = 0;row &lt; 7; row++)</SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; for(int col = 0; col &lt; 7; 
      col++)</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; {</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      if(A[row][col] == 0)</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      cout &lt;&lt; ' ';</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      cout &lt;&lt; '*';</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; }</SPAN>
      <P> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; //</SPAN>别忘了换行:
      <P><SPAN lang=en-us>&nbsp;&nbsp; cout &lt;&lt; endl;</SPAN>
      <P><SPAN lang=en-us>}</SPAN>
      <P> 
      <P>结果如:
      <P align=center><IMG height=117 src="教学--第十七章 数组(二).files/ls17.h4.gif" 
      width=69 border=0>
      <P>大家小时候有没刻过印章?哎!大概80年代出生的人是不会有过这种游戏了。印章分“阴文”和“阳文”。如果把上面的程序稍做修改,即在元素值为0的地方打出“*”,而在元素值为1的地方打出空格,那么输出结果就是“阴文”了。大家不妨试试。
      <P> 
      <P><B>例四:</B><SPAN lang=en-us> </SPAN>躺着的“A”。
      <P> 
      <P>同样使用例三的二维数组数据:
      <P><SPAN lang=en-us>int A[7][7] = </SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,0,0,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,1,0,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,1,0,1,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,1,1,1,1,1,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {1,0,0,0,0,0,1},</SPAN>

⌨️ 快捷键说明

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