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

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

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; {</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout 
      &lt;&lt; arr[row][col] &lt;&lt; ",";&nbsp; //</SPAN>同一行的元素用逗号分开
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; }</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; </SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; cout &lt;&lt; endl;&nbsp; 
      //</SPAN>换行<SPAN lang=en-us> </SPAN>
      <P><SPAN lang=en-us>}</SPAN>
      <P> 
      <P>请大家分别上机试验这两段代码,对比输出结果,明白二维数组中各元素次序。下面是完整程序中,后一段代码的输出:
      <P><IMG height=102 src="教学--第十七章 数组(二).files/ls17.h2.gif" width=199 
      border=0>
      <P> 
      <P> 
      <P>现在说初始化时,如何省略指定二维数组的大小。
      <P>回忆一维数组的情况:
      <P>int arr[] = {0,1,2,3,4};
      <P>代码中没有明显地指出<SPAN 
lang=en-us>arr</SPAN>的大小,但编译器将根据我们对该数组初始化数据,倒推出该数组大小应为5。
      <P> 
      <P>那么,二维数组是否也可以不指定大小呢?比如:
      <P> 
      <P><SPAN lang=en-us>int arr[][] = </SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {1,2,3},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {4,5,6}</SPAN>
      <P><SPAN lang=en-us>}; //ERROR!</SPAN>
      <P> 
      <P>答案是:对了一半……所以还是错,这样定义一个二维数组,编译器不会放过。正确的作法是<SPAN lang=en-us>:</SPAN>
      <P><B>必须指定第二维的大小,而可以不指定第二维的大小</B>,如:
      <P> 
      <P><SPAN lang=en-us>int arr[][3] = </SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {1,2,3},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {4,5,6}&nbsp;&nbsp; </SPAN>
      <P><SPAN lang=en-us>};</SPAN>
      <P> 
      <P>编译器可以根据初始化元素的个数,及低维的尺寸,来推算出第二维大小应为:<SPAN lang=en-us>6 / 3 = 
      2</SPAN>。但是,很可惜,你不能反过来这样:
      <P><SPAN lang=en-us>int arr[2][] = </SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {1,2,3},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {4,5,6}&nbsp;&nbsp; </SPAN>
      <P><SPAN lang=en-us>};&nbsp; //</SPAN>ERROR! 不能不指定低维尺寸。
      <P> 
      <P>事实上,低维的花括号是写给人看的,只要指定低维的尺寸,编译器甚至允许你这么初始化一个二维数组:
      <P> 
      <P><SPAN lang=en-us>int arr[][3] = {1,2,3,4,5,6};&nbsp; 
      //</SPAN>看上去像在初始一维数组?其实是二维的。<SPAN lang=en-us> </SPAN>
      <P> 
      <P>看上去像在初始一维数组?其实是二维的。<SPAN lang=en-us> </SPAN>为什么可以这样?我们下面来说说二维数组的内存结构。
      <P> 
      <H4><B><A name=17.2.3>17.2.3</A> 二维数组的内存结构</B></H4>
      <P> 
      <P>从逻辑上讲,一维数组像一个队列,二维数组像一个方阵,或平面:
      <P> 
      <P> 
      <TABLE id=AutoNumber6 style="BORDER-COLLAPSE: collapse" 
      borderColor=#111111 height=138 cellSpacing=0 cellPadding=0 width="100%" 
      border=0>
        <TBODY>
        <TR>
          <TD align=middle width="43%" height=138>
            <TABLE id=AutoNumber7 
            style="MARGIN-LEFT: 0px; TEXT-INDENT: 0px; MARGIN-RIGHT: 0px; BORDER-COLLAPSE: collapse" 
            borderColor=#111111 height=94 cellSpacing=0 cellPadding=0 
            width="12%" border=1>
              <TBODY>
              <TR>
                <TD align=middle width="100%" height=23><SPAN 
                  lang=en-us>[0]</SPAN></TD></TR>
              <TR>
                <TD align=middle width="100%" height=23><SPAN 
                  lang=en-us>[1]</SPAN></TD></TR>
              <TR>
                <TD align=middle width="100%" height=24><SPAN 
                  lang=en-us>[2]</SPAN></TD></TR>
              <TR>
                <TD align=middle width="100%" height=24><SPAN 
                  lang=en-us>[3]</SPAN></TD></TR></TBODY></TABLE>
            <P><SPAN lang=zh-cn>一维数组是“一长串”</SPAN></P></TD>
          <TD align=middle width="57%" height=138>
            <TABLE id=AutoNumber8 
            style="TEXT-INDENT: 0px; BORDER-COLLAPSE: collapse" 
            borderColor=#111111 height=106 cellSpacing=0 cellPadding=0 
            width="33%" border=1>
              <TBODY>
              <TR>
                <TD align=middle width="33%" bgColor=#c0c0c0 
                height=26>[0][0]</TD>
                <TD align=middle width="33%" bgColor=#c0c0c0 height=26><SPAN 
                  lang=en-us>[0][1]</SPAN></TD>
                <TD align=middle width="34%" bgColor=#c0c0c0 height=26><SPAN 
                  lang=en-us>[0][2]</SPAN></TD></TR>
              <TR>
                <TD align=middle width="33%" height=26>[1][0]</TD>
                <TD align=middle width="33%" height=26><SPAN 
                  lang=en-us>[1][1]</SPAN></TD>
                <TD align=middle width="34%" height=26><SPAN 
                  lang=en-us>[1][2]</SPAN></TD></TR>
              <TR>
                <TD align=middle width="33%" bgColor=#c0c0c0 
                height=27>[2][0]</TD>
                <TD align=middle width="33%" bgColor=#c0c0c0 height=27><SPAN 
                  lang=en-us>[2][1]</SPAN></TD>
                <TD align=middle width="34%" bgColor=#c0c0c0 height=27><SPAN 
                  lang=en-us>[2][2]</SPAN></TD></TR>
              <TR>
                <TD align=middle width="33%" height=27>[3][0]</TD>
                <TD align=middle width="33%" height=27><SPAN 
                  lang=en-us>[3][1]</SPAN></TD>
                <TD align=middle width="34%" height=27><SPAN 
                  lang=en-us>[3][2]</SPAN></TD></TR></TBODY></TABLE>
            <P><SPAN 
        lang=zh-cn>这是一个二维数组,4行3列,像一个4*3的<B>平面</B></SPAN></P></TD></TR></TBODY></TABLE>
      <P> 
      <P><SPAN 
      lang=zh-cn>一维数组的逻辑结构和它在内存里的实际位置相当一致的。但到了二维数组,我们应该想,在内存真的是排成一个“平面”吗?这不可能。内存是一种物理设备,它的地址排列是固定的线性结构,它不可能因为我们写程序中定义了一个二维数组,就把自已的某一段地址空间重新排成一个“平面”。后面我们还要学更高维数组,比如三维数组。三维数组的逻辑结构像一个立方体。你家里有“魔方”吗?拿出来看看,你就会明白内存更不可能把自已排出一个立方体。</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>结论是:内存必须仍然用直线的结构,来表达一个二维数组。</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>比如有一个二维数组:</SPAN>
      <P> 
      <P>char arr[3][2] =&nbsp; //<SPAN lang=zh-cn>一个3行2列的二维数组。</SPAN>
      <P>{
      <P>&nbsp;&nbsp; {'1','2'},
      <P>&nbsp;&nbsp; {'3','4'},
      <P>&nbsp;&nbsp; {'5','6'}
      <P>};
      <P> 
      <P><SPAN lang=zh-cn>它的内存结构应为:</SPAN>
      <P> 
      <DIV align=center>
      <CENTER>
      <TABLE id=AutoNumber9 style="BORDER-COLLAPSE: collapse" 
      borderColor=#111111 cellSpacing=0 cellPadding=0 width="33%" border=1>
        <TBODY>
        <TR>
          <TD width="27%"><SPAN lang=zh-cn>下标</SPAN></TD>
          <TD width="39%"><SPAN lang=zh-cn>内存地址</SPAN>
            <P>(<SPAN lang=zh-cn>仅用示意</SPAN>)</P></TD>
          <TD width="34%"><SPAN lang=zh-cn>元素值</SPAN></TD></TR>
        <TR>
          <TD width="27%" bgColor=#c0c0c0>[0][0]</TD>
          <TD width="39%">100001</TD>
          <TD width="34%">'1'</TD></TR>
        <TR>
          <TD width="27%" bgColor=#c0c0c0>[0][1]</TD>
          <TD width="39%">100002</TD>
          <TD width="34%">'2'</TD></TR>
        <TR>
          <TD width="27%">[1][0]</TD>
          <TD width="39%">100003</TD>
          <TD width="34%">'3'</TD></TR>
        <TR>
          <TD width="27%">[1][1]</TD>
          <TD width="39%">100004</TD>
          <TD width="34%">'4'</TD></TR>
        <TR>
          <TD width="27%" bgColor=#c0c0c0>[2][0]</TD>
          <TD width="39%">100005</TD>
          <TD width="34%">'5'</TD></TR>
        <TR>
          <TD width="27%" bgColor=#c0c0c0>[2][1]</TD>
          <TD width="39%">100006</TD>
          <TD width="34%">'6'</TD></TR></TBODY></TABLE></CENTER></DIV>
      <P align=center>(<SPAN lang=zh-cn>二维数组</SPAN> char arr[3][2] <SPAN 
      lang=zh-cn>的内存结构</SPAN><SPAN lang=en-us>:</SPAN>每个元素之间的地址仍然连续)
      <P> 
      <P><SPAN 
      lang=zh-cn>也就是说,二维数组中的所有元素,存放在内存里时,它们的内存地址仍然是连续的。假如另有一个一维数组:</SPAN>
      <P> 
      <P>char arr[6] = {'1','2','3','4','5','6'}; //<SPAN lang=zh-cn>一维数组</SPAN>
      <P> 
      <P><SPAN lang=zh-cn>这个一维数组的内存结构:</SPAN>
      <DIV align=center>
      <CENTER>
      <TABLE id=AutoNumber10 style="BORDER-COLLAPSE: collapse" 
      borderColor=#111111 cellSpacing=0 cellPadding=0 width="33%" border=1>
        <TBODY>
        <TR>
          <TD width="27%"><SPAN lang=zh-cn>下标</SPAN></TD>
          <TD width="39%"><SPAN lang=zh-cn>内存地址</SPAN>
            <P>(<SPAN lang=zh-cn>仅用示意</SPAN>)</P></TD>
          <TD width="34%"><SPAN lang=zh-cn>元素值</SPAN></TD></TR>
        <TR>
          <TD width="27%">[0]</TD>
          <TD width="39%">100001</TD>
          <TD width="34%">'1'</TD></TR>
        <TR>
          <TD width="27%">[1]</TD>
          <TD width="39%">100002</TD>
          <TD width="34%">'2'</TD></TR>
        <TR>
          <TD width="27%">[<SPAN lang=zh-cn>2</SPAN>]</TD>
          <TD width="39%">100003</TD>
          <TD width="34%">'3'</TD></TR>
        <TR>
          <TD width="27%">[<SPAN lang=zh-cn>3</SPAN>]</TD>
          <TD width="39%">100004</TD>
          <TD width="34%">'4'</TD></TR>
        <TR>
          <TD width="27%">[<SPAN lang=zh-cn>4</SPAN>]</TD>
          <TD width="39%">100005</TD>
          <TD width="34%">'5'</TD></TR>
        <TR>
          <TD width="27%">[<SPAN lang=zh-cn>5</SPAN>]</TD>
          <TD width="39%">100006</TD>
          <TD width="34%">'6'</TD></TR></TBODY></TABLE></CENTER></DIV>
      <P align=center>(<SPAN lang=zh-cn>一维数组</SPAN> char arr[3][2] <SPAN 
      lang=zh-cn>的内存结构</SPAN>)
      <P> 
      <P> 
      <P><SPAN 
      lang=zh-cn>你猜到我想说什么了吗?请对比这两个表:一个有2*3或3*2的二维数组,和一个有6个元素的同类型一维数组,它们的内存结构完全一样。所以前面我们说如此定义并初始化一个二维数组:</SPAN>
      <P> 
      <P><SPAN lang=en-us>int arr[][3] = {1,2,3,4,5,6};</SPAN>
      <P> 
      <P><SPAN 
      lang=zh-cn>也是正确的,只是对于程序员来说有些不直观,但编译器看到的都一样:都是那段同内存中的数据。不一样的是前面的语法。对于一维数组:</SPAN>
      <P>int <FONT color=#ff0000>arr[]</FONT> = <SPAN 

⌨️ 快捷键说明

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