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

📄 第16章 数组(一).htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <P>...</P>
      <P> </P>
      <P>前面关于成绩管理的例子中,已经有过如何改变数组元素值的代码:cin &gt;&gt; cj[i]; 
      这一句将用户输入的成绩赋给数组cj中的第i个元素(i从0计起)。</P>
      <P> </P>
      <P>两个数组可以相互赋值吗?答案也是不行:</P>
      <P> </P>
      <P>int arr1[5] = {1,2,3,4,5};</P>
      <P>int arr2[5];</P>
      <P> </P>
      <P>arr2 = arr2; //不行!整个数组之间不能直接相互赋值。</P>
      <P> </P>
      <P>你可能很不理解为什么上面的代码会出错,不过在学习后面有关指针及内存地址的更多知识以后,你会明白。现在我们只能告诉你,以我们的所学,可以方便地用一个循环来 
      实现将一个数组内的值全部赋值给另一个数组,这也称为数组间的拷贝。</P>
      <P> </P>
      <P>for(int i=0;i&lt;5;i++)</P>
      <P>{</P>
      <P>&nbsp;&nbsp;&nbsp; arr2[i] = arr1[i]; //正确,数组元素之间可以相互赋值。</P>
      <P>}</P>
      <P> </P>
      <P>当然,这样做可一定要注意:当两个数组的元素个数不一致时,不要越界访问:</P>
      <P> </P>
      <P>int arr1[5] = {1,2,3,4,5};</P>
      <P>int arr2[6];</P>
      <P> </P>
      <P>for(int i = 0;i&lt;6;i++)&nbsp; // i 从 0 到 5</P>
      <P>{</P>
      <P>&nbsp;&nbsp;&nbsp; arr2[i] = arr1[i]; </P>
      <P>}</P>
      <P> </P>
      <P>arr2<SPAN lang=zh-cn>有6个元素,而arr1只有5个。</SPAN>当循环执行到 
      i为5时,访问arr1[5]将造成越界。</P>
      <P><SPAN lang=zh-cn>(越界可以直观地理解为“越出边界“,即越出数组的边界</SPAN>,<SPAN 
      lang=zh-cn>访问到了数组以外的内存,其内容将是未知的。)</SPAN></P>
      <P> </P>
      <H3><A name=16.4>16.4</A> <SPAN lang=zh-cn>控制台下如何输入和输出数组</SPAN></H3>
      <P> </P>
      <P><SPAN lang=zh-cn>输入和输出属于程序设计中,用户界面这一方面的内容。在</SPAN>Windows<SPAN 
      lang=zh-cn>图形界面和控制台或DOS的字符界面下会完全不同。</SPAN></P>
      <P> </P>
      <H4><A name=16.4.1>16.4.1</A><SPAN lang=zh-cn> 输入</SPAN> </H4>
      <P><SPAN lang=zh-cn>先说输入:</SPAN></P>
      <P><SPAN lang=zh-cn>以前要让用户输入个某个变量的值,很简单,比如让用户输入一个学成成绩(整型):</SPAN></P>
      <P> </P>
      <P>int cj;</P>
      <P>cin &gt;&gt; cj;</P>
      <P> </P>
      <P><SPAN lang=zh-cn>现在,</SPAN>cj<SPAN lang=zh-cn>是一个数组: </SPAN>int 
      cj[5];</P>
      <P><SPAN lang=zh-cn>那么要输入这5个成绩,是否可以直接写:</SPAN>cin &gt;&gt; cj; <SPAN 
      lang=zh-cn>?</SPAN></P>
      <P><SPAN lang=zh-cn>你可能猜到了:不行。不信可以试试(建议:不管你信不信都请试试)。</SPAN></P>
      <P><SPAN lang=zh-cn>为什么不行?原因是当</SPAN> cin <SPAN lang=zh-cn>碰上</SPAN> 
      cj<SPAN lang=zh-cn>时,它只知道</SPAN> cj<SPAN lang=zh-cn> 
      是整型数组,但它不知道这个数组多大。你可能又要问,为什么</SPAN>cin<SPAN lang=zh-cn>能知道</SPAN>cj<SPAN 
      lang=zh-cn>是一个数组,却不能知道这个数组有多大呢?这又涉及到变量与内存关系。我们先来看这个图:</SPAN></P>
      <P><IMG height=126 src="" width=371 border=0></P>
      <P><SPAN lang=zh-cn>(图:<A name="当 cin 遭遇数组">当</A></SPAN><A 
      name="当 cin 遭遇数组"> cin <SPAN lang=zh-cn>遭遇数组</SPAN></A>,cin<SPAN 
      lang=zh-cn>只“看”到数组中的第一个元素)</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>数组中的各个元素总是连续地存入在内存里。所以在C,C++里</SPAN>,<SPAN 
      lang=zh-cn>为了效率,数组变量的传递,总是只传递第一个元素的内存地址,(后面的元素自然紧跟着)。所以,当</SPAN>cin<SPAN 
      lang=zh-cn>得到</SPAN> cj<SPAN 
      lang=zh-cn>这个数组时,它只看到第一个元素,它知道第一个元素的大小,却并不知道整个数组的大小,也不知道到底有多少个元素在这个数组里。这就有比你是一个窗口的售票员,你知道外面来买票的是一个队伍,但你不知这个队伍到底有多少。当然,C、C++也提供“卖团体票“的函数,但那就需要向这个函数额外传递一个数组的大小的参数。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>说了这么长关于输入的问题,其实解决方法我们早于用过,来一个循环流程,一个一个输入即可:</SPAN></P>
      <P> </P>
      <P>int arr[5];</P>
      <P>for(int i=0;i&lt;5;i++)</P>
      <P>{</P>
      <P>&nbsp;&nbsp; cin &gt;&gt; arr[i];</P>
      <P>}</P>
      <P> </P>
      <H4><A name=16.4.2><SPAN lang=zh-cn>16</SPAN>.4.2</A> <SPAN 
      lang=zh-cn>输出</SPAN></H4>
      <P><SPAN lang=zh-cn>再说输出。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>可想而已,想一次性输出一个数组中的各元素的值,也是不可能的:</SPAN></P>
      <P> </P>
      <P>int arr[5] = {1,2,3,4,5};</P>
      <P> </P>
      <P>cout &lt;&lt; arr; //<SPAN lang=zh-cn>并不能输出</SPAN>arr<SPAN 
      lang=zh-cn>内5个元素的内容。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>你不能就此放过这个问题,我一直建议要多动手,多试试,这次就可以看出作用。当你试着在C++</SPAN> 
      <SPAN lang=zh-cn>B</SPAN>uilder<SPAN 
      lang=zh-cn>内写上面的代码,然后编译,你会发现编译器并没有报错。程序也可以运行。</SPAN></P>
      <P><SPAN lang=zh-cn>请照着下面的代码“试试”:</SPAN></P>
      <P> </P>
      <P>#include &lt;iostream.h&gt;</P>
      <P>int main(int argc, char* argv[])</P>
      <P>{</P>
      <P>&nbsp;&nbsp;&nbsp; int arr[5] = {1,2,3,4,5};</P>
      <P>&nbsp;&nbsp;&nbsp; </P>
      <P>&nbsp;&nbsp;&nbsp; <FONT color=#ff0000>cout &lt;&lt; arr;</FONT> 
      //<SPAN lang=zh-cn>提问:输出一个数组,结果会是什么?</SPAN></P>
      <P> </P>
      <P>&nbsp;&nbsp;&nbsp; cin.get();&nbsp; //<SPAN 
      lang=zh-cn>从本章起,不再使用</SPAN>getchar();<SPAN lang=zh-cn>改为本行</SPAN></P>
      <P>}</P>
      <P> </P>
      <P><SPAN lang=zh-cn>这运行结果截图:<IMG height=50 
      src="第16章 数组(一).files/ls16.h2.gif" width=80 border=0></SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>输出了一个怪怪的数值。这个数值正是数组</SPAN> arr <SPAN 
      lang=zh-cn>在内存中的“门牌号”——地址。并且,数组的地址其实也正是数组中第一个元素的地址。关于数组与内存地址的关系。我们在下一章详细讲解。这里要关心的正事是如何输出数组中的每个元素的值,代码如下:</SPAN></P>
      <P> </P>
      <P>int arr[5];</P>
      <P>for(int i=0;i&lt;5;i++)</P>
      <P>{</P>
      <P>&nbsp;&nbsp; cout &lt;&lt; arr[i];</P>
      <P>}</P>
      <P> </P>
      <P><SPAN lang=zh-cn>同输入一样,还是对元素操作。</SPAN></P>
      <P> </P>
      <H4><A name=16.4.3>16.4.3</A> <SPAN lang=zh-cn>数组输入输出练习</SPAN></H4>
      <P><SPAN lang=zh-cn>现在请大家打开CB,新建一控制台工程。实现以下要求。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>接受用户的键盘输入10个整数,然后输出这10个数,每行输出1个数。</SPAN></P>
      <P><SPAN lang=zh-cn>提示</SPAN>:</P>
      <P><SPAN lang=zh-cn>1、别忘了文件开始位置加入本行:</SPAN>#include &lt;iostream.h&gt;</P>
      <P>2<SPAN lang=zh-cn>、由于</SPAN>Windows<SPAN 
      lang=zh-cn>操作系统的问题,使得其控制台环境下,</SPAN>getch()<SPAN 
      lang=zh-cn>或</SPAN>cin.get()<SPAN 
      lang=zh-cn>在前面有用户输入数值并且回车的情况下,将直接接受回车字符,导致起不到“暂停”的作用。解决方法为:使用两行:</SPAN></P>
      <P>cin.get();</P>
      <P>cin.get();</P>
      <P><SPAN lang=zh-cn>或</SPAN>:</P>
      <P>getchar();</P>
      <P>getchar();</P>
      <P><SPAN lang=zh-cn>从本章开始,我们将改为使用</SPAN>cin.get()<SPAN 
      lang=zh-cn>来起暂停作用。请大家注意。</SPAN></P>
      <P> </P>
      <H3><A name=16.5>16.<SPAN lang=zh-cn>5</SPAN></A> <SPAN 
      lang=zh-cn>数组的尺寸</SPAN></H3>
      <P><SPAN lang=zh-cn>这里的尺寸说的是数组占用内存空间的大小,即某个数组占用了多少个字节。</SPAN></P>
      <P><SPAN lang=zh-cn>以前我们说一个</SPAN>int<SPAN 
      lang=zh-cn>型数据占用4个字节,那么一个有</SPAN>n<SPAN 
      lang=zh-cn>个元素的整型数组占用了多少个字节?几乎可直接猜到:</SPAN>4 * n<SPAN lang=zh-cn> 
      个字节。而一个有</SPAN>n<SPAN lang=zh-cn>个元素的字符型或</SPAN>bool<SPAN 
      lang=zh-cn>型数组,则应占用</SPAN> 1 * n <SPAN 
      lang=zh-cn>个字节,因为它们单个元素的大小均为1字节。</SPAN></P>
      <P><SPAN lang=zh-cn>我们用</SPAN>sizeof<SPAN 
      lang=zh-cn>测量某个变量占用的字节数:</SPAN></P>
      <P>int a;</P>
      <P>int size = sizeof(a);</P>
      <P>size <SPAN lang=zh-cn>将得到 4。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>同样,我们可以这样来得到数组的尺寸:</SPAN></P>
      <P>int arr[10];</P>
      <P>int size = sizeof(arr);</P>
      <P>size <SPAN lang=zh-cn>将得到 </SPAN>40<SPAN lang=zh-cn>。</SPAN></P>
      <P><SPAN lang=zh-cn>你可能会问,为什么前面的</SPAN> cin <SPAN lang=zh-cn>不知道</SPAN> 
      arr<SPAN lang=zh-cn>的尺寸,而</SPAN>sizeof<SPAN 
      lang=zh-cn>却可以得知?因为</SPAN>sizeof<SPAN 
lang=zh-cn>事实上是在编译阶段就进行计算。</SPAN></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>得知数组的尺寸的一个最大的用处,就是可以在程序里通过计算得到这个数组包含几个元素。这相当于一道小学算术题:</SPAN></P>
      <P><SPAN 
      lang=zh-cn>已知某个数组占用40个字节的空间,并且知道该数组单个元素占用4个字节的空间,请问这个数组包含多少个元素?</SPAN></P>
      <P><SPAN lang=zh-cn>看:</SPAN></P>
      <P>int arr[] = {1,2,3,4,5,6,7,8,9,0};</P>
      <P>//<SPAN lang=zh-cn>计算</SPAN>arr<SPAN lang=zh-cn>数组内有多少个元素:</SPAN></P>
      <P>int count = sizeof(arr) / sizeof(arr[0]);</P>
      <P> </P>
      <P>count <SPAN lang=zh-cn>将得到10,即</SPAN>arr<SPAN 
      lang=zh-cn>数组中元素的个数。</SPAN></P>
      <P><SPAN lang=zh-cn>其中</SPAN> sizeof(arr) <SPAN lang=zh-cn>得到 
      整个数组占用的字节数,</SPAN>sizeof(arr[0])<SPAN lang=zh-cn> 
      得到单个元素占用的字节数。数组的基本概念就是每一个元素的大小是并且必须一致的(你可以推想以后我们会学到内中元素可以大小不一的数据结构),为什么我们要取第1个(下标为0)元素</SPAN>?<SPAN 
      lang=zh-cn> 看看下例:</SPAN></P>
      <P> </P>
      <P>int arr[] = {0};</P>
      <P>int count = sizeof(arr) / sizeof(arr[0]);</P>
      <P><SPAN lang=zh-cn>明白了吗?我们或许不知道或</SPAN>arr<SPAN 
      lang=zh-cn>有几个元素,但有一点,并且只有一点可以确定:只要是数组,那么它就<B>至少</B>会有一个元素。可以有</SPAN> int 
      arr[1];<SPAN lang=zh-cn>但不允许有:</SPAN>int arr[0]<SPAN 
      lang=zh-cn>。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>最后,对于简单的数据类型,</SPAN>sizeof<SPAN 
      lang=zh-cn>还可以对其类型进行求值:</SPAN></P>
      <P>int a;</P>
      <P>int size = sizeof(a); size<SPAN lang=zh-cn> 将得到4</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>而直接对</SPAN> int <SPAN lang=zh-cn>操作:</SPAN></P>
      <P>int size = sizeof(int); size<SPAN lang=zh-cn>也将得到</SPAN>4.</P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>数组没有和后者对应的做法。虽然数组也可以有不同类型:整型数组,实型(浮点型)数组,布尔型数组,字符型数组,但数组的大小不仅和它的类型有关系,而且和它含有几个元素有关系。以公式表达:</SPAN></P>
      <P><SPAN lang=zh-cn>数组的大小 =&nbsp; 数组类型的大小</SPAN> * <SPAN 
      lang=zh-cn>元素个数。</SPAN></P>
      <P><SPAN lang=zh-cn>或者:</SPAN></P>
      <P>sizeof(<SPAN lang=zh-cn>数组</SPAN>) = sizeof(<SPAN 
      lang=zh-cn>数组类型</SPAN>) * <SPAN lang=zh-cn>元素个数</SPAN></P>
      <P><SPAN lang=zh-cn>或者:</SPAN></P>
      <P>sizeof(<SPAN lang=zh-cn>数组)</SPAN>= sizeof(<SPAN 
      lang=zh-cn>数组</SPAN>[0]) * <SPAN lang=zh-cn>元素个数</SPAN></P>
      <P> </P>
      <H3><A name=16.6>16.<SPAN lang=zh-cn>6</SPAN></A> 字符数组</H3>
      <P><SPAN 
      lang=zh-cn>字符数组具有一些特殊性,主要在三方面:1、初始化,2、输入输出、3、结束字符。大家需要注意了。</SPAN></P>
      <H4><A name=16.6.1>16.<SPAN lang=zh-cn>6</SPAN>.1</A> <SPAN 
      lang=zh-cn>字符数组通常用于显示</SPAN></H4>
      <P>前面我们用整型表示成绩,所以数组:<SPAN lang=en-us>int 
cj[5000];</SPAN>是一个整数数组,或整型数组。</P>
      <P>其它的数据类型,如果浮点型:<SPAN lang=en-us>float</SPAN>、布尔型:<SPAN 
      lang=en-us>bool</SPAN> 或者字符型 <SPAN lang=en-us>char </SPAN>均可以有相关的数组,如:</P>
      <P>int age[] {25,32,29,40};</P>
      <P><SPAN lang=en-us>float money[] = {1000.50,2000,2870.95}; </SPAN></P>

⌨️ 快捷键说明

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