a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C++ > 正文

C++數(shù)組的存儲|C++數(shù)組所占內(nèi)存空間

2020-05-23 14:27:31
字體:
供稿:網(wǎng)友
我們以前說變量像箱子,數(shù)組像倉庫。在這一節(jié),我們要來深入探究一下,這些“箱子”和“倉庫”在電腦內(nèi)部是怎樣擺放的。

內(nèi)存和地址

我們知道變量和數(shù)組都是放在內(nèi)存里的,我們有時(shí)候還能夠聽到內(nèi)存地址(Address)這個(gè)詞。那么地址究竟是什么意思呢?

其實(shí)在內(nèi)存里,就像是許許多多的街道,每條街道有它的名字,而街道上的每幢房子又按順序地編了號,于是街道名和房子在街道上的編號就能確定內(nèi)存中唯一的一幢房子,我們在這里認(rèn)為所有的數(shù)據(jù)在內(nèi)存中都是放在房子里。電腦就是依照這個(gè)原理找到所要的訪問或修改的數(shù)據(jù)的。街道名和房子在街道上的編號就稱為這個(gè)房子的地址。我們通常把地址表示為一串十六進(jìn)制的數(shù)。關(guān)于十六進(jìn)制數(shù)我們在這里不作展開說明。

C++數(shù)組的存儲|C++數(shù)組所占內(nèi)存空間那么這些內(nèi)存中的房子和我們所說的變量和數(shù)組是什么關(guān)系呢?在內(nèi)存里的房子的大小是規(guī)定的,每幢房子只能存儲一個(gè)字節(jié)(Byte)的數(shù)據(jù)。(一個(gè)字節(jié)相當(dāng)于一個(gè)半角的英文字母,一個(gè)漢字需要占用兩個(gè)字節(jié)。)有時(shí)候,一種類型的變量需要比較大的空間,比如一個(gè)浮點(diǎn)型的實(shí)數(shù),一幢房子是放不下的,而是需要4幢房子的空間才能放得下。于是電腦就把連起來的4幢房子拼起來,每幢房子放這個(gè)實(shí)數(shù)的一部分?jǐn)?shù)據(jù)。而這連起來的4幢房子,構(gòu)成了一個(gè)能夠存放浮點(diǎn)型實(shí)數(shù)的變量。

我們認(rèn)為,內(nèi)存中的“房子”是客觀存在的,每幢房子的大小一樣,沒有任何區(qū)別;而不同類型的變量“箱子”則是由若干幢房子拼接而成,箱子在內(nèi)存中是不存在的,只是我們?yōu)榱朔奖憷斫舛芟氤鰜淼摹?/span>右圖就是一個(gè)浮點(diǎn)型變量在內(nèi)存中的情況。(圖7.2.1)

數(shù)組在內(nèi)存中的存儲情況

C++數(shù)組的存儲|C++數(shù)組所占內(nèi)存空間變量在內(nèi)存中是由若干個(gè)相鄰的“房子”拼接而成的,而數(shù)組在內(nèi)存中則是由若干個(gè)相鄰的數(shù)組元素按順序拼接而成的。每個(gè)數(shù)組元素又相當(dāng)于一個(gè)變量。左圖是一個(gè)大小為3的短整型(short)數(shù)組在內(nèi)存中的情況。(圖7.2.2)

我們在上一節(jié)的最后說到可以省略數(shù)組的大小,但是這樣一來我們就無法得知數(shù)組的大小了,這將可能造成越界訪問。當(dāng)我們了解了數(shù)組在內(nèi)存中的存儲情況后,我們就能夠知道數(shù)組的大小了。在C++中,有一個(gè)名為sizeof的操作符,可以求出一個(gè)數(shù)組或一種數(shù)據(jù)類型在內(nèi)存中占了多少“房子”,它的使用方法是:
    sizeof(數(shù)組名或數(shù)據(jù)類型);

通過左圖我們可以理解,要求出數(shù)組的大小,應(yīng)該是用整個(gè)數(shù)組占的“房子”數(shù)除以每一個(gè)數(shù)組元素占的“房子”數(shù),即6除以2等于3。下面我們就來看一個(gè)求出數(shù)組大小的程序?qū)嵗海ǔ绦?.2.1)
#include "iostream.h"
int main()
{
int array[]={3,5,6,8,7,9};
int size=sizeof(array)/sizeof(int);
cout <<"size="<<size <<endl;
for (int i=0;i<size;i++)
cout <<array[i] <<" ";
cout <<endl;
return 0;
}
運(yùn)行結(jié)果:
size=6
3 5 6 8 7 9

通過這個(gè)程序,可以成功地知道一個(gè)數(shù)組的大小,我們也不用為可能發(fā)生的越界訪問而發(fā)愁了。

字符的存儲情況

電腦是用電來計(jì)算和保存信息的。在電腦里,就好像有許許多多的開關(guān),用導(dǎo)通(開)來表示1,用斷開(關(guān))來表示0。那么這些個(gè)“0”和“1”是怎么來表示一些字符的呢?

當(dāng)只有一個(gè)開關(guān)的時(shí)候,這個(gè)開關(guān)能表示兩種狀態(tài),即0和1;當(dāng)有兩個(gè)開關(guān)的時(shí)候,這兩個(gè)開關(guān)可以表示四種狀態(tài),即00、01、10、11……如果你學(xué)過排列,就不難理解,當(dāng)有8個(gè)開關(guān)的時(shí)候,可以表示28=256種狀態(tài),分別是0~255。在電腦中,就是用8個(gè)開關(guān)(0或1)來表示一個(gè)字節(jié)的,每一個(gè)開關(guān)(0或1)稱為一個(gè)“位”(Bit),即8位組成一個(gè)字節(jié)。我們把一個(gè)字節(jié)所能表示的256種狀態(tài)和256個(gè)字符按一定的順序一一對應(yīng)起來,一個(gè)字節(jié)就可以表示256種不同的字符。這種用8位二進(jìn)制表示一個(gè)字符的編碼稱為ASCII碼(念aski),它的全稱是美國信息交換標(biāo)準(zhǔn)碼(America Standard Code for Information Interchange)。我們需要記住的ASCII碼有三個(gè),數(shù)字0的ASCII碼為十進(jìn)制的48,大寫字母A的ASCII碼為十進(jìn)制的65,小寫字母a的ASCII碼為十進(jìn)制的97。

下面我們就來編寫一段程序,輸出ASCII碼表的常用部分:(程序7.2.2)
#include "iostream.h"
#include "iomanip.h"
int main()
{
   char temp;
   for (int i=32;i<=127;i++)
   {
      temp=i;
      cout << setw(2) <<temp;
      if (i%16==15) //從0~15正好16個(gè),所以余數(shù)為15的時(shí)候換行
      {
         cout <<endl; 
      }
   }
   return 0;
}
運(yùn)行結(jié)果:
C++數(shù)組的存儲|C++數(shù)組所占內(nèi)存空間
以上這段程序輸出了96個(gè)常用的字符,從空格(ASCII碼為十進(jìn)制的32)一直到三角(ASCII碼為十進(jìn)制的127)。每行16個(gè)字符,共6行。有些人可能要問一個(gè)問題,上面這段程序中怎么能把整型變量i賦值給字符型變量temp呢?根據(jù)前面我們所說的字符的存儲原理,不難發(fā)現(xiàn)字符的實(shí)質(zhì)是一個(gè)0~255的整數(shù),所以把一個(gè)在這個(gè)范圍內(nèi)的整數(shù)賦值給字符變量在C++中是允許的。

字符數(shù)組在內(nèi)存中的存儲情況

我們以前說過,字符和字符串是不同的:字符只能是一個(gè),而字符串是由若干個(gè)字符連接而成。可是,’a’和”a”有區(qū)別嗎?

其實(shí)字符和字符串的區(qū)別有點(diǎn)像單詞和句子的區(qū)別。一句句子可能只有一個(gè)單詞組成,但是句號卻是必不可少的,否則就不能稱為句子了。字符串在結(jié)尾處也會加上一個(gè)“句號”來表示字符串的結(jié)束,稱為結(jié)尾符。在C++中用數(shù)組表示的字符串的結(jié)尾符是’/0’,它也是一個(gè)字符。所以字符串”a”實(shí)際上是兩個(gè)字符,即字符’a’和結(jié)尾符’/0’。

在初始化一個(gè)字符數(shù)組的時(shí)候有兩種初始化方式,一種是按字符串初始化,一種是按字符初始化。按字符串初始化就會在最后一個(gè)元素出現(xiàn)結(jié)尾符,而結(jié)尾符也要占用一個(gè)字符的空間,所以在聲明數(shù)組的時(shí)候一定要注意空間是否足夠。下面我們就來看一下這兩種初始化方法:(程序7.2.3)
C++數(shù)組的存儲|C++數(shù)組所占內(nèi)存空間#include "iostream.h"
int main()
{
   char a[]={"Hello"};//按字符串初始化
   char b[]={'H','e','l','l','o'};//按字符初始化
   char c[]={'H','e','l','l','o','/0'};//按字符串初始化
   cout <<"Size of A=" <<sizeof(a) <<endl;
   cout <<"Size of B=" <<sizeof(b) <<endl;
   cout <<"Size of C=" <<sizeof(c) <<endl;
   cout <<a <<endl;
   cout <<b <<endl;
   cout <<c <<endl;
   return 0;
}
運(yùn)行結(jié)果:
Size of A=6
Size of B=5
Size of C=6
Hello
Hello燙蘃ello
Hello

從數(shù)組a、b和c的大小,我們就能看出按字符串和按字符初始化的不同了。你可能還會發(fā)現(xiàn),輸出的數(shù)組a和c都是正常的,為什么輸出的b卻夾雜著亂碼呢?這是因?yàn)閍和c的屬性都是字符串的字符數(shù)組,而b是普通字符數(shù)組。b數(shù)組沒有結(jié)尾符,電腦在輸出它的時(shí)候就會發(fā)生問題了。

數(shù)組a和b在內(nèi)存中的存儲情況如右上圖所示(圖7.2.3)
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 噜噜噜天天躁狠狠躁夜夜精品 | 九九综合九九 | 午夜精品久久久久久久星辰影院 | 九九精品视频在线 | 亚洲一区二区三区久久 | 国产精品国产精品国产专区不蜜 | 国产精品久久久久久久久久久久久 | 日韩三级视频 | 欧美日韩成人在线观看 | 久久久久久毛片 | 欧美成人精品在线观看 | 国产欧美一区二区精品久久 | 成人国产精品 | 免费99精品国产自在在线 | 欧美精品区 | 九色在线| 久久精品在线视频 | 午夜免费视频 | 日韩在线看片 | 亚洲欧美一区二区三区视频 | 97香蕉久久国产超碰青草软件 | 日本一区二区三区中文字幕 | 久久久www成人免费无遮挡大片 | 欧美一级在线观看视频 | 伊人网站| 久在线观看 | 精品久久久久久亚洲精品 | 日本涩涩视频 | 色婷婷av久久久久久久 | 美女福利网站 | 夸克满天星在线观看 | 伊人久操| 久久久久久成人精品 | 伊人99| h在线看| 国产欧美一区二区精品忘忧草 | 午夜窝窝 | 黑人巨大精品欧美一区二区一视频 | 色五月情 | 欧美精品一二三 | 黄色影视在线免费观看 |