国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

C++數組的存儲|C++數組所占內存空間

2020-05-23 14:27:31
字體:
來源:轉載
供稿:網友
我們以前說變量像箱子,數組像倉庫。在這一節,我們要來深入探究一下,這些“箱子”和“倉庫”在電腦內部是怎樣擺放的。

內存和地址

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

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

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

我們認為,內存中的“房子”是客觀存在的,每幢房子的大小一樣,沒有任何區別;而不同類型的變量“箱子”則是由若干幢房子拼接而成,箱子在內存中是不存在的,只是我們為了方便理解而臆想出來的。右圖就是一個浮點型變量在內存中的情況。(圖7.2.1)

數組在內存中的存儲情況

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

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

通過左圖我們可以理解,要求出數組的大小,應該是用整個數組占的“房子”數除以每一個數組元素占的“房子”數,即6除以2等于3。下面我們就來看一個求出數組大小的程序實例:(程序7.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;
}
運行結果:
size=6
3 5 6 8 7 9

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

字符的存儲情況

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

當只有一個開關的時候,這個開關能表示兩種狀態,即0和1;當有兩個開關的時候,這兩個開關可以表示四種狀態,即00、01、10、11……如果你學過排列,就不難理解,當有8個開關的時候,可以表示28=256種狀態,分別是0~255。在電腦中,就是用8個開關(0或1)來表示一個字節的,每一個開關(0或1)稱為一個“位”(Bit),即8位組成一個字節。我們把一個字節所能表示的256種狀態和256個字符按一定的順序一一對應起來,一個字節就可以表示256種不同的字符。這種用8位二進制表示一個字符的編碼稱為ASCII碼(念aski),它的全稱是美國信息交換標準碼(America Standard Code for Information Interchange)。我們需要記住的ASCII碼有三個,數字0的ASCII碼為十進制的48,大寫字母A的ASCII碼為十進制的65,小寫字母a的ASCII碼為十進制的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個,所以余數為15的時候換行
      {
         cout <<endl; 
      }
   }
   return 0;
}
運行結果:
C++數組的存儲|C++數組所占內存空間
以上這段程序輸出了96個常用的字符,從空格(ASCII碼為十進制的32)一直到三角(ASCII碼為十進制的127)。每行16個字符,共6行。有些人可能要問一個問題,上面這段程序中怎么能把整型變量i賦值給字符型變量temp呢?根據前面我們所說的字符的存儲原理,不難發現字符的實質是一個0~255的整數,所以把一個在這個范圍內的整數賦值給字符變量在C++中是允許的。

字符數組在內存中的存儲情況

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

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

在初始化一個字符數組的時候有兩種初始化方式,一種是按字符串初始化,一種是按字符初始化。按字符串初始化就會在最后一個元素出現結尾符,而結尾符也要占用一個字符的空間,所以在聲明數組的時候一定要注意空間是否足夠。下面我們就來看一下這兩種初始化方法:(程序7.2.3)
C++數組的存儲|C++數組所占內存空間#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;
}
運行結果:
Size of A=6
Size of B=5
Size of C=6
Hello
Hello燙蘃ello
Hello

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

數組a和b在內存中的存儲情況如右上圖所示(圖7.2.3)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昭通市| 宣城市| 吴桥县| 铁岭县| 通州市| 鲜城| 商水县| 那曲县| 梨树县| 应用必备| 天水市| 余干县| 财经| 博客| 湟源县| 绥滨县| 龙川县| 阿尔山市| 西贡区| 临沧市| 修文县| 霸州市| 吴堡县| 满城县| 桃园县| 临泉县| 苏尼特右旗| 扎兰屯市| 中卫市| 张家界市| 澳门| 北辰区| 铁岭县| 平远县| 婺源县| 宁都县| 阿克| 方山县| 枝江市| 开阳县| 防城港市|