本節書摘來自異步社群出版社《好學的c++程式設計》一書中的第2章,第2.1節,作者: 張祖浩 , 沈天晴,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
好學的c++程式設計
我們平時所常用的基本資料類型有char(字元型)、int(整數型)、float(帶小數點的數,稱為實數型)、double(雙精度帶小數點的數,簡稱雙精度型)。
其中,char型資料在計算機中實際就是以8位二進制碼(ascii碼)所表示的一個整數。故從本質上說,char型也可看成是整數型。常用的字元見附錄中ascii碼。字元可以對整型變量指派。反過來,整數也可對字元類型變量指派。二者是相通的。字元進行算術運算時,以其ascii碼值參與運算。
表2-1中,按資料有無正負,可修飾為signed(有正負)或unsigned(無正負,即全正);按資料的長度大小又可修飾為short(短)或long(長)。這些修飾詞與基本資料類型組合後,綜合而形成如表2-1所示的常用的各種基本資料類型。

照理,對每種資料類型都需作出定義後才可使用,但現在表中所示各種類型含義都已清楚而明确,是以就不必作出定義了。類型定義又稱為類型聲明。
表2-1中的各項具體資料對不同的c++系統有可能會有所差別。
表2-1中談到存儲空間、長度和取值範圍,現作具體說明如下。
變量存儲空間及其大小、位址、類型、内容
一般而言,随着程式的運作,資料之值會有所變化,故稱之為資料變量,簡稱變量。常量可以看做是變量的特殊情況。
用以存儲變量值的記憶體空間叫做變量存儲空間,簡稱存儲空間。成串的存儲空間連成一片,稱為存儲區。
存儲空間是由連續的記憶體單元組成的,1個記憶體單元可存儲1位元組(即8位二進制數)。存儲空間大小可用記憶體單元數(即位元組數)來表示。拿int型變量來說,表2-1表明,int型存儲空間占4個位元組,即占4個記憶體單元,如圖2.1所示。
從圖2.1所示來看,存儲空間所占的每個記憶體單元都有其位址,是連續編的,例如圖中1326~1329。存儲空間的第一個記憶體單元位址(即首位元組位址,圖中是1326)就定義為該存儲空間的位址。如果存儲空間中存儲了某變量,則此位址也作為該變量的位址。
變量有類型,其存儲空間也應該有類型。我們把變量的類型定義為其存儲空間的類型。也就是說,變量存儲空間的類型就是所存儲變量的類型。比如,int型存儲空間是存儲int型變量的;char型存儲空間是存儲char型變量的……存儲空間的類型與所存儲變量的類型是一緻的。
如果變量之值存入了存儲空間,則存儲空間内容就是該變量之值。否則,存儲空間内容是一個随機值,說不定是多大多小。
存儲空間中變量值怎麼安置
資料變量值在存儲空間中是怎樣安置的呢?對整數而言,存儲安置的規則是:變量值的高位位元組存于高位址的記憶體單元中;低位位元組存于低位址的記憶體單元中。
拿圖2.1中情況來說,圖中int型變量值、存儲空間及其各位元組情況如下:
比如,設一個int型變量的二進制值為:11011011011011010010011010100011,
以十六進制表示就是:db6d26a3共占4個位元組,4個位元組中的資料分别為:db、6d、26、a3。它們分别存儲在4個記憶體單元中。按“高位位元組存于高位址,低位位元組存于低位址”的規則,安置如圖2.2所示。
以上的安置規則對于所有整型變量都是适用的。對實型變量的安置較複雜,本書就不談了。
存儲空間的大小及檢測
存儲空間的大小用存儲空間所占記憶體單元數(位元組數)來表示。從表2-1中看出,存儲空間的大小是視類型而定的。對不同的計算機系統,各類型資料的存儲空間位元組數有可能有差别,我們可以用存儲空間位元組數運算符sizeof來進行檢測。用的形式是:
sizeof的值就是括弧中的資料類型存儲空間的位元組數。例子如下。
【例2-1】檢測表2-1中各類型變量存儲空間的位元組數。程式如下:
程式運作結果輸出如下:
程式中,共有4個輸出語句,形式都相同。每一句都是先輸出雙引号中的字串,接着輸出sizeof之值,即變量類型存儲空間的位元組數。各語句最後的'n'是換行的意思。
資料變量的長度和取值範圍
一個位元組是8位二進制數。一個變量存儲空間的位元組數乘以8就是該變量值的二進制總位數,這叫作該變量的長度。變量長度定下了,變量取值範圍也定了,具體見表2-1中最右列。
程式運作中,如果某變量的運算超出其取值範圍,則會産生溢出錯誤,這要引起注意。
2.1.3 資料常量怎樣表示
代數式y=x+5中,x和y是變量,5是常量。c++中根據資料常量的不同類型采用不同的表示法,今分述如下:
整數常量的表示
(1)十進制整數的表示:這和我們平時所熟悉的形式一樣,不必多談。
(2)十六進制整數的表示:以0x或0x開頭(其中0不是字母而是數字零),後跟着由0~f組合而成的整數,這是十六進制數的表示。例如0x5c就表示十六進制數5c。
實數常量的表示
實數是帶小數點的數,其有效值預設是6位。表示形式有下列兩種:
(1)一般形式:例如,14.8、−23.98,這和我們平時所熟悉的形式一樣。
(2)科學記數法(又叫指數形式):例如,0.75×109表示為0.75e+9,−28.6×10−9表示為−28.6e−9。若小數點前留1位,則是标準科學記數法。例如前面二數分别表示為7.5e+8和−2.86e−8就是标準的科學記數。e大寫小寫都行,但e前e後都必須有數字。像e-5或0.67e這樣表示都是非法的。
(3)字尾f或f的實數為float型。例如34.56f和67.45f。無字尾的實數預設為double型。例如34.56和67.45就預設為double型。
字元常量的表示
(1)對于可以通過鍵盤輸入的,可顯示的字元,可用單引号界定表示。例如‘a’、‘#’和‘?’等。
(2)對于不可以通過鍵盤輸入的,不可顯示的字元,c++提供了一種叫做轉義序列的表示方法,常用的見表2-2。它是用反斜杠 将一個字元的含義作了轉變,故稱轉義。
平時‘n’、‘t’、‘0’三者含義分别是字元n、t、0。如果三者各加入一個反斜杠成為‘n’、‘t’、‘0’,則含義就轉變了。轉義成特定含義,見表中1~3行含義列中所示。
平時反斜杠、單引号’、雙引号”三者各有其特定含義,分别用于轉義、字元界定、字元串界定。若想把它們單純作為字元用而寫成‘’、‘’’、‘”’,那是不夠的,因為其特定含義并未改變。必須加入反斜杠進行轉義,寫成‘’、‘’’、‘”’。這樣寫就不按其特定含義,而是轉義分别作為字元、字元’、字元”使用,見表中4~6行含義列中所示。
字元串常量的表示
字元串常量是用雙引号界定的不可改變的字元序列。例如下面的幾個:
存儲時,每條字元串結尾處都要加一個結尾符‘0’以表示字元串結束。結尾符‘0’是ascii碼為零的字元null。
字元串和結尾符一起,存儲于字元存儲空間串中。所占記憶體單元總數應該是字元個數加1。
單個字元和上述字元串們在記憶體中的存儲情況如圖2.3所示。圖中‘a’是單引号界定的,是單個字元;“a”是雙引号界定的,是字元串。二者在存儲方面的差別在于前者隻占一個記憶體單元,而後者則因為額外加了一個字元串結尾符,故占兩個記憶體單元。
由于平時雙引号是作為字元串界定符使用的。若在字元串内有雙引号作為字元串成員,則為避免誤會就必須加反斜杠,以對其特定含義進行轉義。例如對于下面的字元串:
應表示為:
由于平時反斜杠是作為轉義的意思使用的。如果在字元串内有反斜杠作為字元串成員,則必須加反斜杠,以對其特定含義進行轉義。例如對于表示檔案路徑的字元串:
以上說的是在程式中,若要表示a行或c行的字元串,則必須分别用b行或d行的形式表示之。但是,如果是從鍵盤輸入a行或c行的字元串,則所有字元一律平等,均照原樣按鍵就行,不必加轉義的反斜杠。
在程式中,中文常以字元串形式出現。例如“請輸入同學姓名。”,一個中文字的代碼占用兩個記憶體單元,中文标點符号亦然。字元串結尾符則和上述一樣,也是‘0’或0,隻占一個記憶體單元。是以字元串“請輸入同學姓名。”連同字元串結尾符在内,總共占17個記憶體單元,也就是17個位元組。這可用語句cout<
字元串常量的值
字元串常量的存儲是由系統配給相應的字元存儲空間串,将字元們連同結尾符依次存入各個存儲空間中。把該字元串的首字元位址作為該字元串常量的值。
程式中,凡某資料變量首次出場,都應該作一個聲明,表明該變量屬何類型。系統就根據該變量類型,配給相應存儲空間,用以存儲該變量之值。然後才能對該變量進行操作使用。
變量聲明的一般形式如下:
資料類型 變量名1,變量名2,…,變量名n;
例如,下列兩條語句聲明了int 型變量n和total;float 型變量vol、r和hig。
句末的分号表示語句的結束。在同一條語句中聲明多個變量時,互相間要用逗号隔開。
在聲明變量的同時,也可以用“=”給變量設定初值(又叫做初始化)。例如:
a初值為5,b初值為3.45,c初值為‘g’。聲明語句中,用“=”進行初始化。
若不在聲明的同時進行初始化,而在聲明過後另賦初值也行。例如:
每一條語句都用分号結束。前兩條語句是變量聲明語句。後兩條語句都是指派語句,指派語句中“=”是指派運算符,作指派用。
注意,在程式内,“=”在聲明語句中作初始化用,在指派語句中作指派運算符用。在程式之外的數學等式中“=”是作等号用。不同場合有不同含義,注意不要混淆。
對變量進行通路就是對變量存儲空間内容進行“讀”或“寫”
我們知道,資料是程式處理的對象。要對資料進行處理,就必然要對資料進行通路。所謂對資料進行通路,實際就是對資料變量存儲空間進行指派或取值。
指派就是去原值存新值。指派就好比是将原值覆寫掉,寫上新值。取值不是像取蘋果或取錢那樣取一個少一個的。取值實際上是讀值。存儲空間中的值是萬讀不變的。
是以,簡言之,所謂對變量進行通路,實際就是對變量存儲空間内容進行“讀”或“寫”。
“直呼其名”通路、直呼别名通路、循址通路
“直呼其名”通路就是用變量名,對變量進行通路。這是通路變量的一種基本方式。例如,在第1章例1-1中有一語句“dif=a-b;”。此句指派運算符“=”的右側a-b的意思是從變量a和變量b的存儲空間中讀出二者之值,求出二者之差a-b。然後,通過指派運算符“=”将二者之差a-b賦給左側的變量dif。這樣,dif存儲空間中的值就是a-b了。這就是用各變量之名對各變量進行讀值或寫值。是“直呼其名”的通路。這種通路較簡單,不多談。
變量還可以另取一個别名,可用别名進行通路。這和“直呼其名”一樣,不過是“直呼其别名”而已。
我們知道,變量存儲空間是有位址的。是以,要對變量進行通路還可以采用循址通路的方式進行通路。變量位址又叫指針,即用指針進行通路。
下面将對别名和指針分别進行介紹。
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。