超碰91资源站-超碰97豆花-超碰97人妻-超碰97人人干-超碰97人人香蕉-超碰97天天操-超碰97在线资源站-超碰97资源站共享-超碰97资源站总站-超碰aa在线91-超碰av操-超碰爱爱

半岛外围网上直营

C++程序設計知識要點

轉帖|其它|編輯:郝浩|2010-06-28 12:02:10.000|閱讀 556 次

概述:本篇說明內容是C++中的關鍵,基本大部分人對于這些內容都是昏的,但這些內容又是編程的基礎中的基礎,必須詳細說明。

# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

  本篇說明內容是C++中的關鍵,基本大部分人對于這些內容都是昏的,但這些內容又是編程的基礎中的基礎,必須詳細說明。

  數字表示

  數學中,數只有數值大小的不同,絕不會有數值占用空間的區別,即數學中的數是邏輯上的一個概念,但電腦不是。考慮算盤,每個算盤上有很多列算子,每列都分成上下兩排算子。上排算子有2個,每個代表5,下排算子有4個,每個代表1(這并不重要)。因此算盤上的每列共有6個算子,每列共可以表示0到14這15個數字(因為上排算子的可能狀態有0到2個算子有效,而下排算子則可能有0到4個算子有效,故為3×5=15種組合方式)。

  上面的重點就是算盤的每列并沒有表示0到14這15個數字,而是每列有15種狀態,因此被人利用來表示數字而已(這很重要)。由于算盤的每列有15個狀態,因此用兩列算子就可以有15×15=225個狀態,因此可以表示0到224。阿拉伯數字的每一位有0到9這10個圖形符號,用兩個阿拉伯數字圖形符號時就能有10×10=100個狀態,因此可以表示0到99這100個數。

  這里的算盤其實就是一個基于15進制的記數器(可以通過維持一列算子的狀態來記錄一位數字),它的一列算子就相當于一位阿拉伯數字,每列有15種狀態,故能表示從0到14這15個數字,超出14后就必須通過進位來要求另一列算子的加入以表示數字。電腦與此一樣,其并不是數字計算機,而是電子計算機,電腦中通過一根線的電位高低來表示數字。一根線中的電位規定只有兩種狀態——高電位和低電位,因此電腦的數字表示形式是二進制的。

  和上面的算盤一樣,一根電線只有兩個狀態,當要表示超出1的數字時,就必須進位來要求另一根線的加入以表示數字。所謂的32位電腦就是提供了32根線(被稱作數據總線)來表示數據,因此就有2的32次方那么多種狀態。而16根線就能表示2的16次方那么多種狀態。

  所以,電腦并不是基于二進制數,而是基于狀態的變化,只不過這個狀態可以使用二進制數表示出來而已。即電腦并不認識二進制數,這是下面“類型”一節的基礎。

  內存

  內存就是電腦中能記錄數字的硬件,但其存儲速度很快(與硬盤等低速存儲設備比較),又不能較長時間保存數據,所以經常被用做草稿紙,記錄一些臨時信息。

  前面已經說過,32位計算機的數字是通過32根線上的電位狀態的組合來表示的,因此內存能記錄數字,也就是能維持32根線上各自的電位狀態(就好象算盤的算子撥動后就不會改變位置,除非再次撥動它)。不過依舊考慮上面的算盤,假如一個算盤上有15列算子,則一個算盤能表示15的15次方個狀態,是很大的數字,但經常實際是不會用到變化那么大的數字的,因此讓一個算盤只有兩列算子,則只能表示225個狀態,當數字超出時就使用另一個或多個算盤來一起表示。

  上面不管是2列算子還是15列算子,都是算盤的粒度,粒度分得過大造成不必要的浪費(很多列算子都不使用),太小又很麻煩(需要多個算盤)。電腦與此一樣。2的32次方可表示的數字很大,一般都不會用到,如果直接以32位存儲在內存中勢必造成相當大的資源浪費。于是如上,規定內存的粒度為8位二進制數,稱為一個內存單元,而其大小稱為一個字節(Byte)。就是說,內存存儲數字,至少都會記錄8根線上的電位狀態,也就是2的8次方共256種狀態。所以如果一個32位的二進制數要存儲在內存中,就需要占據4個內存單元,也就是4個字節的內存空間。

  我們在紙上寫字,是通過肉眼判斷出字在紙上的相對橫坐標和縱坐標以查找到要看的字或要寫字的位置。同樣,由于內存就相當于草稿紙,因此也需要某種定位方式來定位,在電腦中,就是通過一個數字來定位的。這就和旅館的房間號一樣,內存單元就相當于房間(假定每個房間只能住一個人),而前面說的那個數字就相當于房間號。為了向某塊內存中寫入數據(就是使用某塊內存來記錄數據總線上的電位狀態),就必須知道這塊內存對應的數字,而這個數字就被稱為地址。而通過給定的地址找到對應的內存單元就稱為尋址。

  因此地址就是一個數字,用以唯一標識某一特定內存單元。此數字一般是32位長的二進制數,也就可以表示4G個狀態,也就是說一般的32位電腦都具有4G的內存空間尋址能力,即電腦最多裝4G的內存,如果電腦有超過4G的內存,此時就需要增加地址的長度,如用40位長的二進制數來表示。

  類型

  在本系列最開頭時已經說明了何謂編程,而剛才更進一步說明了電腦其實連數字都不認識,只是狀態的記錄,而所謂的加法也只是人為設計那個加法器以使得兩個狀態經過加法器的處理而生成的狀態正好和數學上的加法的結果一樣而已。這一切的一切都只說明一點:電腦所做的工作是什么,全視使用的人以為是什么。

  因此為了利用電腦那很快的“計算”能力(實際是狀態的變換能力),人為規定了如何解釋那些狀態。為了方便其間,對于前面提出的電位的狀態,我們使用1位二進制數來表示,則上面提出的狀態就可以使用一個二進制數來表示,而所謂的“如何解釋那些狀態”就變成了如何解釋一個二進制數。

  C++是高級語言,為了幫助解釋那些二進制數,提供了類型這個概念。類型就是人為制訂的如何解釋內存中的二進制數的協議。C++提供了下面的一些標準類型定義。

  ·signed char 表示所指向的內存中的數字使用補碼形式,表示的數字為-128到+127,長度為1個字節

  ·unsigned char 表示所指向的內存中的數字使用原碼形式,表示的數字為0到255,長度為1個字節

  ·signed short 表示所指向的內存中的數字使用補碼形式,表示的數字為–32768到+32767,長度為2個字節

  ·unsigned short 表示所指向的內存中的數字使用原碼形式,表示的數字為0到65535,長度為2個字節

  ·signed long 表示所指向的內存中的數字使用補碼形式,表示的數字為-2147483648到+2147483647,長度為4個字節

  ·unsigned long 表示所指向的內存中的數字使用原碼形式,表示的數字為0到4294967295,長度為4個字節

  ·signed int 表示所指向的內存中的數字使用補碼形式,表示的數字則視編譯器。如果編譯器編譯時被指明編譯為在16位操作系統上運行,則等同于signed short;如果是編譯為32位的,則等同于signed long;如果是編譯為在64位操作系統上運行,則為8個字節長,而范圍則如上一樣可以自行推算出來。

  ·unsigned int 表示所指向的內存中的數字使用原碼形式,其余和signed int一樣,表示的是無符號數。

  ·bool 表示所指向的內存中的數字為邏輯值,取值為false或true。長度為1個字節。

  ·float 表示所指向的內存按IEEE標準進行解釋,為real*4,占用4字節內存空間,等同于上篇中提到的單精度浮點數。

  ·double 表示所指向的內存按IEEE標準進行解釋,為real*8,可表示數的精度較float高,占用8字節內存空間,等同于上篇提到的雙精度浮點數。

  ·long double 表示所指向的內存按IEEE標準進行解釋,為real*10,可表示數的精度較double高,但在為32位Windows操作系統編寫程序時,仍占用8字節內存空間,等效于double,只是如果CPU支持此類浮點類型則還是可以進行這個精度的計算。

  標準類型不止上面的幾個,后面還會陸續提到。

  上面的長度為2個字節也就是將兩個連續的內存單元中的數字取出并合并在一起以表示一個數字,這和前面說的一個算盤表示不了的數字,就進位以加入另一個算盤幫助表示是同樣的道理。

  上面的signed關鍵字是可以去掉的,即char等同于signed char,用以簡化代碼的編寫。但也僅限于signed,如果是unsigned char,則在使用時依舊必須是unsigned char。

  現在應該已經了解上篇中為什么數字還要分什么有符號無符號、長整型短整型之類的了,而上面的short、char等也都只是長度不同,這就由程序員自己根據可能出現的數字變化幅度來進行選用了。

  類型只是對內存中的數字的解釋,但上面的類型看起來相對簡單了點,且語義并不是很強,即沒有什么特殊意思。為此,C++提供了自定義類型,也就是后繼文章中將要說明的結構、類等。

  在本系列的第一篇中已經說過,電腦編程的絕大部分工作就是操作內存,而上面說了,為了操作內存,需要使用地址來標識要操作的內存塊的首地址(上面的long表示連續的4個字節內存,其第一個內存單元的地址稱作這連續4個字節內存塊的首地址)。為此我們在編寫程序時必須記下地址。

  做5+2/3-5*2的計算,先計算出2/3的值,寫在草稿紙上,接著算出5*2的值,又寫在草稿紙上。為了接下來的加法和減法運算,必須能夠知道草稿紙上的兩個數字哪個是2/3的值哪個是5*2的值。人就是通過記憶那兩個數在紙上的位置來記憶的,而電腦就是通過地址來標識的。但電腦只會做加減乘除,不會去主動記那些2/3、5*2的中間值的位置,也就是地址。因此程序員必須完成這個工作,將那兩個地址記下來。

  問題就是這里只有兩個值,也許好記一些,但如果多了,人是很難記住哪個地址對應哪個值的,但人對符號比對數字要敏感得多,即人很容易記下一個名字而不是一個數字。為此,程序員就自己寫了一個表,表有兩列,一列是“2/3的值”,一列是對應的地址。如果式子稍微復雜點,那么那個表可能就有個二三十行,而每寫一行代碼就要去翻查相應的地址,如果來個幾萬行代碼那是人都不能忍受。

  C++作為高級語言,很正常地提供了上面問題的解決之道,就是由編譯器來幫程序員維護那個表,要查的時候是編譯器去查,這也就是變量的功能。

  變量是一個映射元素。上面提到的表由編譯器維護,而表中的每一行都是這個表的一個元素(也稱記錄)。表有三列:變量名、對應地址和相應類型。變量名是一個標識符,因此其命名規則完全按照上一篇所說的來。當要對某塊內存寫入數據時,程序員使用相應的變量名進行內存的標識,而表中的對應地址就記錄了這個地址,進而將程序員給出的變量名,一個標識符,映射成一個地址,因此變量是一個映射元素。而相應類型則告訴編譯器應該如何解釋此地址所指向的內存,是2個連續字節還是4個?是原碼記錄還是補碼?而變量所對應的地址所標識的內存的內容叫做此變量的值。

  有如下的變量解釋:“可變的量,其相當于一個盒子,數字就裝在盒子里,而變量名就寫在盒子外面,這樣電腦就知道我們要處理哪一個盒子,且不同的盒子裝不同的東西,裝字符串的盒子就不能裝數字。”上面就是我第一次學習編程時,書上寫的(是BASIC語言)。對于初學者也許很容易理解,也不能說錯,但是造成的誤解將導致以后的程序編寫地千瘡百孔。

  上面的解釋隱含了一個意思——變量是一塊內存。這是嚴重錯誤的!如果變量是一塊內存,那么C++中著名的引用類型將被棄置荒野。變量實際并不是一塊內存,只是一個映射元素,這是致關重要的。

  內存的種類

  前面已經說了內存是什么及其用處,但內存是不能隨便使用的,因為操作系統自己也要使用內存,而且現在的操作系統正常情況下都是多任務操作系統,即可同時執行多個程序,即使只有一個CPU。因此如果不對內存訪問加以節制,可能會破壞另一個程序的運作。比如我在紙上寫了2/3的值,而你未經我同意且未通知我就將那個值擦掉,并寫上5*2的值,結果我后面的所有計算也就出錯了。

  因此為了使用一塊內存,需要向操作系統申請,由操作系統統一管理所有程序使用的內存。所以為了記錄一個long類型的數字,先向操作系統申請一塊連續的4字節長的內存空間,然后操作系統就會在內存中查看,看是否還有連續的4個字節長的內存,如果找到,則返回此4字節內存的首地址,然后編譯器編譯的指令將其記錄在前面提到的變量表中,最后就可以用它記錄一些臨時計算結果了。

  上面的過程稱為要求操作系統分配一塊內存。這看起來很不錯,但是如果只為了4個字節就要求操作系統搜索一下內存狀況,那么如果需要100個臨時數據,就要求操作系統分配內存100次,很明顯地效率低下(無謂的99次查看內存狀況)。因此C++發現了這個問題,并且操作系統也提出了相應的解決方法,最后提出了如下的解決之道。

  棧(Stack) 任何程序執行前,預先分配一固定長度的內存空間,這塊內存空間被稱作棧(這種說法并不準確,但由于實際涉及到線程,在此為了不將問題復雜化才這樣說明),也被叫做堆棧。那么在要求一個4字節內存時,實際是在這個已分配好的內存空間中獲取內存,即內存的維護工作由程序員自己來做,即程序員自己判斷可以使用哪些內存,而不是操作系統,直到已分配的內存用完。

  很明顯,上面的工作是由編譯器來做的,不用程序員操心,因此就程序員的角度來看什么事情都沒發生,還是需要像原來那樣向操作系統申請內存,然后再使用。

  但工作只是從操作系統變到程序自己而已,要維護內存,依然要耗費CPU的時間,不過要簡單多了,因為不用標記一塊內存是否有人使用,而專門記錄一個地址。此地址以上的內存空間就是有人正在使用的,而此地址以下的內存空間就是無人使用的。之所以是以下的空間為無人使用而不是以上,是當此地址減小到0時就可以知道堆棧溢出了(如果你已經有些基礎,請不要把0認為是虛擬內存地址,關于虛擬內存將會在《C++從零開始(十八)》中進行說明,這里如此解釋只是為了方便理解)。而且CPU還專門對此法提供了支持,給出了兩條指令,轉成匯編語言就是push和pop,表示壓棧和出棧,分別減小和增大那個地址。

  而最重要的好處就是由于程序一開始執行時就已經分配了一大塊連續內存,用一個變量記錄這塊連續內存的首地址,然后程序中所有用到的,程序員以為是向操作系統分配的內存都可以通過那個首地址加上相應偏移來得到正確位置,而這很明顯地由編譯器做了。因此實際上等同于在編譯時期(即編譯器編譯程序的時候)就已經分配了內存(注意,實際編譯時期是不能分配內存的,因為分配內存是指程序運行時向操作系統申請內存,而這里由于使用堆棧,則編譯器將生成一些指令,以使得程序一開始就向操作系統申請內存,如果失敗則立刻退出,而如果不退出就表示那些內存已經分配到了,進而代碼中使用首地址加偏移來使用內存也就是有效的),但壞處也就是只能在編譯時期分配內存。

  堆(Heap) 上面的工作是編譯器做的,即程序員并不參與堆棧的維護。但上面已經說了,堆棧相當于在編譯時期分配內存,因此一旦計算好某塊內存的偏移,則這塊內存就只能那么大,不能變化了(如果變化會導致其他內存塊的偏移錯誤)。比如要求客戶輸入定單數據,可能有10份定單,也可能有100份定單,如果一開始就定好了內存大小,則可能造成不必要的浪費,又或者內存不夠。

  為了解決上面的問題,C++提供了另一個途徑,即允許程序員有兩種向操作系統申請內存的方式。前一種就是在棧上分配,申請的內存大小固定不變。后一種是在堆上分配,申請的內存大小可以在運行的時候變化,不是固定不變的。

  那么什么叫堆?在Windows操作系統下,由操作系統分配的內存就叫做堆,而棧可以認為是在程序開始時就分配的堆(這并不準確,但為了不復雜化問題,故如此說明)。因此在堆上就可以分配大小變化的內存塊,因為是運行時期即時分配的內存,而不是編譯時期已計算好大小的內存塊。

  變量的定義

  上面說了那么多,你可能看得很暈,畢竟連一個實例都沒有,全是文字,下面就來幫助加深對上面的理解。

  定義一個變量,就是向上面說的由編譯器維護的變量表中添加元素,其語法如下:

  long a;

  先寫變量的類型,然后一個或多個空格或制表符(\t)或其它間隔符,接著變量的名字,最后用分號結束。要同時定義多個變量,則各變量間使用逗號隔開,如下:

  long a, b, c; unsigned short e, a_34c;

  上面是兩條變量定義語句,各語句間用分號隔開,而各同類型變量間用逗號隔開。而前面的式子5+2/3-5*2,則如下書寫。

  long a = 2/3, b = 5*2; long c = 5 + a – b;

  可以不用再去記那煩人的地址了,只需記著a、b這種簡單的標識符。當然,上面的式子不一定非要那么寫,也可以寫成:long c = 5 + 2 / 3 – 5 * 2; 而那些a、b等中間變量編譯器會自動生成并使用(實際中編譯器由于優化的原因將直接計算出結果,而不會生成實際的計算代碼)。

  下面就是問題的關鍵,定義變量就是添加一個映射。前面已經說了,這個映射是將變量名和一個地址關聯,因此在定義一個變量時,編譯器為了能將變量名和某個地址對應起來,幫程序員在前面提到的棧上分配了一塊內存,大小就視這個變量類型的大小。如上面的a、b、c的大小都是4個字節,而e、a_34c的大小都是2個字節。

  假設編譯器分配的棧在一開始時的地址是1000,并假設變量a所對應的地址是1000-56,則b所對應的地址就是1000-60,而c所對應的就是1000-64,e對應的是1000-66,a_34c是1000-68。如果這時b突然不想是4字節了,而希望是8字節,則后續的c、e、a_34c都將由于還是原來的偏移位置而使用了錯誤的內存,這也就是為什么棧上分配的內存必須是固定大小。

  考慮前面說的紅色文字:“變量實際并不是一塊內存,只是一個映射元素”。可是只要定義一個變量,就會相應地得到一塊內存,為什么不說變量就是一塊內存?上面定義變量時之所以會分配一塊內存是因為變量是一個映射元素,需要一個對應地址,因此才在棧上分配了一塊內存,并將其地址記錄到變量表中。但是變量是可以有別名的,即另一個名字。這個說法是不準確的,應該是變量所對應的內存塊有另一個名字,而不止是這個變量的名字。

  為什么要有別名?這是語義的需要,表示既是什么又是什么。比如一塊內存,里面記錄了老板的信息,因此起名為Boss,但是老板又是另一家公司的行政經理,故變量名應該為Manager,而在程序中有段代碼是老板的公司相關的,而另一段是老板所在公司相關的,在這兩段程序中都要使用到老板的信息,那到底是使用Boss還是Manager?其實使用什么都不會對最終生成的機器代碼產生什么影響,但此處出于語義的需要就應該使用別名,以期從代碼上表現出所編寫程序的意思。

  在C++中,為了支持變量別名,提供了引用變量這個概念。要定義一個引用變量,在定義變量時,在變量名的前面加一個“&”,如下書寫:

  long a; long &a1 = a, &a2 = a, &a3 = a2;

  上面的a1、a2、a3都是a所對應的內存塊的別名。這里在定義變量a時就在棧上分配了一塊4字節內存,而在定義a1時卻沒有分配任何內存,直接將變量a所映射的地址作為變量a1的映射地址,進而形成對定義a時所分配的內存的別名。因此上面的Boss和Manager,應該如下(其中Person是一個結構或類或其他什么自定義類型,這將在后繼的文章中陸續說明):

  Person Boss; Person &Manager = Boss;

  由于變量一旦定義就不能改變(指前面說的變量表里的內容,不是變量的值),直到其被刪除,所以上面在定義引用變量的時候必須給出欲別名的變量以初始化前面的變量表,否則編譯器編譯時將報錯。

  現在應該就更能理解前面關于變量的紅字的意思了。并不是每個變量定義時都會分配內存空間的。而關于如何在堆上分配內存,將在介紹完指針后予以說明,并進而說明上一篇遺留下來的關于字符串的問題。  本篇說明內容是C++中的關鍵,基本大部分人對于這些內容都是昏的,但這些內容又是編程的基礎中的基礎,必須詳細說明。

  數字表示

  數學中,數只有數值大小的不同,絕不會有數值占用空間的區別,即數學中的數是邏輯上的一個概念,但電腦不是。考慮算盤,每個算盤上有很多列算子,每列都分成上下兩排算子。上排算子有2個,每個代表5,下排算子有4個,每個代表1(這并不重要)。因此算盤上的每列共有6個算子,每列共可以表示0到14這15個數字(因為上排算子的可能狀態有0到2個算子有效,而下排算子則可能有0到4個算子有效,故為3×5=15種組合方式)。

  上面的重點就是算盤的每列并沒有表示0到14這15個數字,而是每列有15種狀態,因此被人利用來表示數字而已(這很重要)。由于算盤的每列有15個狀態,因此用兩列算子就可以有15×15=225個狀態,因此可以表示0到224。阿拉伯數字的每一位有0到9這10個圖形符號,用兩個阿拉伯數字圖形符號時就能有10×10=100個狀態,因此可以表示0到99這100個數。

  這里的算盤其實就是一個基于15進制的記數器(可以通過維持一列算子的狀態來記錄一位數字),它的一列算子就相當于一位阿拉伯數字,每列有15種狀態,故能表示從0到14這15個數字,超出14后就必須通過進位來要求另一列算子的加入以表示數字。電腦與此一樣,其并不是數字計算機,而是電子計算機,電腦中通過一根線的電位高低來表示數字。一根線中的電位規定只有兩種狀態——高電位和低電位,因此電腦的數字表示形式是二進制的。

  和上面的算盤一樣,一根電線只有兩個狀態,當要表示超出1的數字時,就必須進位來要求另一根線的加入以表示數字。所謂的32位電腦就是提供了32根線(被稱作數據總線)來表示數據,因此就有2的32次方那么多種狀態。而16根線就能表示2的16次方那么多種狀態。

  所以,電腦并不是基于二進制數,而是基于狀態的變化,只不過這個狀態可以使用二進制數表示出來而已。即電腦并不認識二進制數,這是下面“類型”一節的基礎。

  內存

  內存就是電腦中能記錄數字的硬件,但其存儲速度很快(與硬盤等低速存儲設備比較),又不能較長時間保存數據,所以經常被用做草稿紙,記錄一些臨時信息。

  前面已經說過,32位計算機的數字是通過32根線上的電位狀態的組合來表示的,因此內存能記錄數字,也就是能維持32根線上各自的電位狀態(就好象算盤的算子撥動后就不會改變位置,除非再次撥動它)。不過依舊考慮上面的算盤,假如一個算盤上有15列算子,則一個算盤能表示15的15次方個狀態,是很大的數字,但經常實際是不會用到變化那么大的數字的,因此讓一個算盤只有兩列算子,則只能表示225個狀態,當數字超出時就使用另一個或多個算盤來一起表示。

  上面不管是2列算子還是15列算子,都是算盤的粒度,粒度分得過大造成不必要的浪費(很多列算子都不使用),太小又很麻煩(需要多個算盤)。電腦與此一樣。2的32次方可表示的數字很大,一般都不會用到,如果直接以32位存儲在內存中勢必造成相當大的資源浪費。于是如上,規定內存的粒度為8位二進制數,稱為一個內存單元,而其大小稱為一個字節(Byte)。就是說,內存存儲數字,至少都會記錄8根線上的電位狀態,也就是2的8次方共256種狀態。所以如果一個32位的二進制數要存儲在內存中,就需要占據4個內存單元,也就是4個字節的內存空間。

  我們在紙上寫字,是通過肉眼判斷出字在紙上的相對橫坐標和縱坐標以查找到要看的字或要寫字的位置。同樣,由于內存就相當于草稿紙,因此也需要某種定位方式來定位,在電腦中,就是通過一個數字來定位的。這就和旅館的房間號一樣,內存單元就相當于房間(假定每個房間只能住一個人),而前面說的那個數字就相當于房間號。為了向某塊內存中寫入數據(就是使用某塊內存來記錄數據總線上的電位狀態),就必須知道這塊內存對應的數字,而這個數字就被稱為地址。而通過給定的地址找到對應的內存單元就稱為尋址。

  因此地址就是一個數字,用以唯一標識某一特定內存單元。此數字一般是32位長的二進制數,也就可以表示4G個狀態,也就是說一般的32位電腦都具有4G的內存空間尋址能力,即電腦最多裝4G的內存,如果電腦有超過4G的內存,此時就需要增加地址的長度,如用40位長的二進制數來表示。

  類型

  在本系列最開頭時已經說明了何謂編程,而剛才更進一步說明了電腦其實連數字都不認識,只是狀態的記錄,而所謂的加法也只是人為設計那個加法器以使得兩個狀態經過加法器的處理而生成的狀態正好和數學上的加法的結果一樣而已。這一切的一切都只說明一點:電腦所做的工作是什么,全視使用的人以為是什么。

  因此為了利用電腦那很快的“計算”能力(實際是狀態的變換能力),人為規定了如何解釋那些狀態。為了方便其間,對于前面提出的電位的狀態,我們使用1位二進制數來表示,則上面提出的狀態就可以使用一個二進制數來表示,而所謂的“如何解釋那些狀態”就變成了如何解釋一個二進制數。

  C++是高級語言,為了幫助解釋那些二進制數,提供了類型這個概念。類型就是人為制訂的如何解釋內存中的二進制數的協議。C++提供了下面的一些標準類型定義。

  ·signed char 表示所指向的內存中的數字使用補碼形式,表示的數字為-128到+127,長度為1個字節

  ·unsigned char 表示所指向的內存中的數字使用原碼形式,表示的數字為0到255,長度為1個字節

  ·signed short 表示所指向的內存中的數字使用補碼形式,表示的數字為–32768到+32767,長度為2個字節

  ·unsigned short 表示所指向的內存中的數字使用原碼形式,表示的數字為0到65535,長度為2個字節

  ·signed long 表示所指向的內存中的數字使用補碼形式,表示的數字為-2147483648到+2147483647,長度為4個字節

  ·unsigned long 表示所指向的內存中的數字使用原碼形式,表示的數字為0到4294967295,長度為4個字節

  ·signed int 表示所指向的內存中的數字使用補碼形式,表示的數字則視編譯器。如果編譯器編譯時被指明編譯為在16位操作系統上運行,則等同于signed short;如果是編譯為32位的,則等同于signed long;如果是編譯為在64位操作系統上運行,則為8個字節長,而范圍則如上一樣可以自行推算出來。

  ·unsigned int 表示所指向的內存中的數字使用原碼形式,其余和signed int一樣,表示的是無符號數。

  ·bool 表示所指向的內存中的數字為邏輯值,取值為false或true。長度為1個字節。

  ·float 表示所指向的內存按IEEE標準進行解釋,為real*4,占用4字節內存空間,等同于上篇中提到的單精度浮點數。

  ·double 表示所指向的內存按IEEE標準進行解釋,為real*8,可表示數的精度較float高,占用8字節內存空間,等同于上篇提到的雙精度浮點數。

  ·long double 表示所指向的內存按IEEE標準進行解釋,為real*10,可表示數的精度較double高,但在為32位Windows操作系統編寫程序時,仍占用8字節內存空間,等效于double,只是如果CPU支持此類浮點類型則還是可以進行這個精度的計算。

  標準類型不止上面的幾個,后面還會陸續提到。

  上面的長度為2個字節也就是將兩個連續的內存單元中的數字取出并合并在一起以表示一個數字,這和前面說的一個算盤表示不了的數字,就進位以加入另一個算盤幫助表示是同樣的道理。

  上面的signed關鍵字是可以去掉的,即char等同于signed char,用以簡化代碼的編寫。但也僅限于signed,如果是unsigned char,則在使用時依舊必須是unsigned char。

  現在應該已經了解上篇中為什么數字還要分什么有符號無符號、長整型短整型之類的了,而上面的short、char等也都只是長度不同,這就由程序員自己根據可能出現的數字變化幅度來進行選用了。

  類型只是對內存中的數字的解釋,但上面的類型看起來相對簡單了點,且語義并不是很強,即沒有什么特殊意思。為此,C++提供了自定義類型,也就是后繼文章中將要說明的結構、類等。

  在本系列的第一篇中已經說過,電腦編程的絕大部分工作就是操作內存,而上面說了,為了操作內存,需要使用地址來標識要操作的內存塊的首地址(上面的long表示連續的4個字節內存,其第一個內存單元的地址稱作這連續4個字節內存塊的首地址)。為此我們在編寫程序時必須記下地址。

  做5+2/3-5*2的計算,先計算出2/3的值,寫在草稿紙上,接著算出5*2的值,又寫在草稿紙上。為了接下來的加法和減法運算,必須能夠知道草稿紙上的兩個數字哪個是2/3的值哪個是5*2的值。人就是通過記憶那兩個數在紙上的位置來記憶的,而電腦就是通過地址來標識的。但電腦只會做加減乘除,不會去主動記那些2/3、5*2的中間值的位置,也就是地址。因此程序員必須完成這個工作,將那兩個地址記下來。

  問題就是這里只有兩個值,也許好記一些,但如果多了,人是很難記住哪個地址對應哪個值的,但人對符號比對數字要敏感得多,即人很容易記下一個名字而不是一個數字。為此,程序員就自己寫了一個表,表有兩列,一列是“2/3的值”,一列是對應的地址。如果式子稍微復雜點,那么那個表可能就有個二三十行,而每寫一行代碼就要去翻查相應的地址,如果來個幾萬行代碼那是人都不能忍受。

  C++作為高級語言,很正常地提供了上面問題的解決之道,就是由編譯器來幫程序員維護那個表,要查的時候是編譯器去查,這也就是變量的功能。

  變量是一個映射元素。上面提到的表由編譯器維護,而表中的每一行都是這個表的一個元素(也稱記錄)。表有三列:變量名、對應地址和相應類型。變量名是一個標識符,因此其命名規則完全按照上一篇所說的來。當要對某塊內存寫入數據時,程序員使用相應的變量名進行內存的標識,而表中的對應地址就記錄了這個地址,進而將程序員給出的變量名,一個標識符,映射成一個地址,因此變量是一個映射元素。而相應類型則告訴編譯器應該如何解釋此地址所指向的內存,是2個連續字節還是4個?是原碼記錄還是補碼?而變量所對應的地址所標識的內存的內容叫做此變量的值。

  有如下的變量解釋:“可變的量,其相當于一個盒子,數字就裝在盒子里,而變量名就寫在盒子外面,這樣電腦就知道我們要處理哪一個盒子,且不同的盒子裝不同的東西,裝字符串的盒子就不能裝數字。”上面就是我第一次學習編程時,書上寫的(是BASIC語言)。對于初學者也許很容易理解,也不能說錯,但是造成的誤解將導致以后的程序編寫地千瘡百孔。

  上面的解釋隱含了一個意思——變量是一塊內存。這是嚴重錯誤的!如果變量是一塊內存,那么C++中著名的引用類型將被棄置荒野。變量實際并不是一塊內存,只是一個映射元素,這是致關重要的。

  內存的種類

  前面已經說了內存是什么及其用處,但內存是不能隨便使用的,因為操作系統自己也要使用內存,而且現在的操作系統正常情況下都是多任務操作系統,即可同時執行多個程序,即使只有一個CPU。因此如果不對內存訪問加以節制,可能會破壞另一個程序的運作。比如我在紙上寫了2/3的值,而你未經我同意且未通知我就將那個值擦掉,并寫上5*2的值,結果我后面的所有計算也就出錯了。

  因此為了使用一塊內存,需要向操作系統申請,由操作系統統一管理所有程序使用的內存。所以為了記錄一個long類型的數字,先向操作系統申請一塊連續的4字節長的內存空間,然后操作系統就會在內存中查看,看是否還有連續的4個字節長的內存,如果找到,則返回此4字節內存的首地址,然后編譯器編譯的指令將其記錄在前面提到的變量表中,最后就可以用它記錄一些臨時計算結果了。

  上面的過程稱為要求操作系統分配一塊內存。這看起來很不錯,但是如果只為了4個字節就要求操作系統搜索一下內存狀況,那么如果需要100個臨時數據,就要求操作系統分配內存100次,很明顯地效率低下(無謂的99次查看內存狀況)。因此C++發現了這個問題,并且操作系統也提出了相應的解決方法,最后提出了如下的解決之道。

  棧(Stack) 任何程序執行前,預先分配一固定長度的內存空間,這塊內存空間被稱作棧(這種說法并不準確,但由于實際涉及到線程,在此為了不將問題復雜化才這樣說明),也被叫做堆棧。那么在要求一個4字節內存時,實際是在這個已分配好的內存空間中獲取內存,即內存的維護工作由程序員自己來做,即程序員自己判斷可以使用哪些內存,而不是操作系統,直到已分配的內存用完。

  很明顯,上面的工作是由編譯器來做的,不用程序員操心,因此就程序員的角度來看什么事情都沒發生,還是需要像原來那樣向操作系統申請內存,然后再使用。

  但工作只是從操作系統變到程序自己而已,要維護內存,依然要耗費CPU的時間,不過要簡單多了,因為不用標記一塊內存是否有人使用,而專門記錄一個地址。此地址以上的內存空間就是有人正在使用的,而此地址以下的內存空間就是無人使用的。之所以是以下的空間為無人使用而不是以上,是當此地址減小到0時就可以知道堆棧溢出了(如果你已經有些基礎,請不要把0認為是虛擬內存地址,關于虛擬內存將會在《C++從零開始(十八)》中進行說明,這里如此解釋只是為了方便理解)。而且CPU還專門對此法提供了支持,給出了兩條指令,轉成匯編語言就是push和pop,表示壓棧和出棧,分別減小和增大那個地址。

  而最重要的好處就是由于程序一開始執行時就已經分配了一大塊連續內存,用一個變量記錄這塊連續內存的首地址,然后程序中所有用到的,程序員以為是向操作系統分配的內存都可以通過那個首地址加上相應偏移來得到正確位置,而這很明顯地由編譯器做了。因此實際上等同于在編譯時期(即編譯器編譯程序的時候)就已經分配了內存(注意,實際編譯時期是不能分配內存的,因為分配內存是指程序運行時向操作系統申請內存,而這里由于使用堆棧,則編譯器將生成一些指令,以使得程序一開始就向操作系統申請內存,如果失敗則立刻退出,而如果不退出就表示那些內存已經分配到了,進而代碼中使用首地址加偏移來使用內存也就是有效的),但壞處也就是只能在編譯時期分配內存。

  堆(Heap) 上面的工作是編譯器做的,即程序員并不參與堆棧的維護。但上面已經說了,堆棧相當于在編譯時期分配內存,因此一旦計算好某塊內存的偏移,則這塊內存就只能那么大,不能變化了(如果變化會導致其他內存塊的偏移錯誤)。比如要求客戶輸入定單數據,可能有10份定單,也可能有100份定單,如果一開始就定好了內存大小,則可能造成不必要的浪費,又或者內存不夠。

  為了解決上面的問題,C++提供了另一個途徑,即允許程序員有兩種向操作系統申請內存的方式。前一種就是在棧上分配,申請的內存大小固定不變。后一種是在堆上分配,申請的內存大小可以在運行的時候變化,不是固定不變的。

  那么什么叫堆?在Windows操作系統下,由操作系統分配的內存就叫做堆,而棧可以認為是在程序開始時就分配的堆(這并不準確,但為了不復雜化問題,故如此說明)。因此在堆上就可以分配大小變化的內存塊,因為是運行時期即時分配的內存,而不是編譯時期已計算好大小的內存塊。

  變量的定義

  上面說了那么多,你可能看得很暈,畢竟連一個實例都沒有,全是文字,下面就來幫助加深對上面的理解。

  定義一個變量,就是向上面說的由編譯器維護的變量表中添加元素,其語法如下:

  long a;

  先寫變量的類型,然后一個或多個空格或制表符(\t)或其它間隔符,接著變量的名字,最后用分號結束。要同時定義多個變量,則各變量間使用逗號隔開,如下:

  long a, b, c; unsigned short e, a_34c;

  上面是兩條變量定義語句,各語句間用分號隔開,而各同類型變量間用逗號隔開。而前面的式子5+2/3-5*2,則如下書寫。

  long a = 2/3, b = 5*2; long c = 5 + a – b;

  可以不用再去記那煩人的地址了,只需記著a、b這種簡單的標識符。當然,上面的式子不一定非要那么寫,也可以寫成:long c = 5 + 2 / 3 – 5 * 2; 而那些a、b等中間變量編譯器會自動生成并使用(實際中編譯器由于優化的原因將直接計算出結果,而不會生成實際的計算代碼)。

  下面就是問題的關鍵,定義變量就是添加一個映射。前面已經說了,這個映射是將變量名和一個地址關聯,因此在定義一個變量時,編譯器為了能將變量名和某個地址對應起來,幫程序員在前面提到的棧上分配了一塊內存,大小就視這個變量類型的大小。如上面的a、b、c的大小都是4個字節,而e、a_34c的大小都是2個字節。

  假設編譯器分配的棧在一開始時的地址是1000,并假設變量a所對應的地址是1000-56,則b所對應的地址就是1000-60,而c所對應的就是1000-64,e對應的是1000-66,a_34c是1000-68。如果這時b突然不想是4字節了,而希望是8字節,則后續的c、e、a_34c都將由于還是原來的偏移位置而使用了錯誤的內存,這也就是為什么棧上分配的內存必須是固定大小。

  考慮前面說的紅色文字:“變量實際并不是一塊內存,只是一個映射元素”。可是只要定義一個變量,就會相應地得到一塊內存,為什么不說變量就是一塊內存?上面定義變量時之所以會分配一塊內存是因為變量是一個映射元素,需要一個對應地址,因此才在棧上分配了一塊內存,并將其地址記錄到變量表中。但是變量是可以有別名的,即另一個名字。這個說法是不準確的,應該是變量所對應的內存塊有另一個名字,而不止是這個變量的名字。

  為什么要有別名?這是語義的需要,表示既是什么又是什么。比如一塊內存,里面記錄了老板的信息,因此起名為Boss,但是老板又是另一家公司的行政經理,故變量名應該為Manager,而在程序中有段代碼是老板的公司相關的,而另一段是老板所在公司相關的,在這兩段程序中都要使用到老板的信息,那到底是使用Boss還是Manager?其實使用什么都不會對最終生成的機器代碼產生什么影響,但此處出于語義的需要就應該使用別名,以期從代碼上表現出所編寫程序的意思。

  在C++中,為了支持變量別名,提供了引用變量這個概念。要定義一個引用變量,在定義變量時,在變量名的前面加一個“&”,如下書寫:

  long a; long &a1 = a, &a2 = a, &a3 = a2;

  上面的a1、a2、a3都是a所對應的內存塊的別名。這里在定義變量a時就在棧上分配了一塊4字節內存,而在定義a1時卻沒有分配任何內存,直接將變量a所映射的地址作為變量a1的映射地址,進而形成對定義a時所分配的內存的別名。因此上面的Boss和Manager,應該如下(其中Person是一個結構或類或其他什么自定義類型,這將在后繼的文章中陸續說明):

  Person Boss; Person &Manager = Boss;

  由于變量一旦定義就不能改變(指前面說的變量表里的內容,不是變量的值),直到其被刪除,所以上面在定義引用變量的時候必須給出欲別名的變量以初始化前面的變量表,否則編譯器編譯時將報錯。

  現在應該就更能理解前面關于變量的紅字的意思了。并不是每個變量定義時都會分配內存空間的。而關于如何在堆上分配內存,將在介紹完指針后予以說明,并進而說明上一篇遺留下來的關于字符串的問題。


標簽:

本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn

文章轉載自:IT專家網

為你推薦

  • 推薦視頻
  • 推薦活動
  • 推薦產品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
利記足球官網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 真人boyu·博魚滾球網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 最大網上PM娛樂城盤口(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 正規雷火競技官方買球(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 雷火競技權威十大網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) boyu·博魚信譽足球官網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 權威188BET足球網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 正規188BET足球大全(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 国产+欧美日韩+一区二区三区 | 国产99久久久国产精品潘金莲 | 国产精品视频一区国模私拍 | 国产爆初菊在线观看免费视频 | 波多野结衣中文字幕全集 | 国产精品午夜成人一区二区 | 国产精品熟女一区二区 | 91人妻无码精品一区二区夜色 | 国产爆乳无码一区二区麻豆 | 国产原创无码视频在线观看 | 国色天香精品卡一卡2卡3卡4卡 | 成人午夜免费福利视频 | 国产精品三级女人国产香蕉 | 国产精品兄妹伦理片一区二区 | 国产区人妖另类精 | 国产精品无码一区二区三区不卡 | 精品国产免费入口 | 精品亚洲一区二区三区在线播放 | 国产精品日韩一区二区三 | 国产国语成人三级丰满激情视频在线 | 国产日韩亚洲三级片在线观 | 国产成人在线免费观看 | 91嫩草免费国产永久入口 | 爆乳jk美女脱内衣裸体网站 | 91视频官网国产 | 91精品久久久久一区二区三区 | 国产精品一区二区三区四区五区 | 91青草国产超碰人人 | 成人精品观看视频在 | av免费大片在线观看 | 成人三级视频在线观看一区二区 | 成人一区二区三区 | 91九色在线播放 | 国产一区免费精品在线 | 顶级欧美熟妇 | 国产一区鲁鲁在线视频免费播放 | 精品精品国产高清a毛片 | 国内免费视频一区二区三区 | 日韩在线中文字幕 | 国产精品美女久久久久久久久 | 国产精品国产高清国产av | 国产无套射精网站 | 国产丝袜一区二 | 国产精品中文字幕在线观看 | 动漫中国麻豆av无码精品一区二区 | 国产欧美日产高清欧美 | 18禁无遮拦无码国产在线播放 | 91精品国产自 | 国产精品盗摄偷窥盗摄 | 91精品福利自产拍在线观看 | 成人无码精品1区2区3区免费看 | 99久久国产综合导航电影 | 精品国产aⅴ一区二区三区 精品国产aⅴ一区二区三区4区 | 成人国产一区二区 | 国产原创在线亚洲黄色大片高 | www.脏片| a级无码久久久一区 | 国产午夜亚洲精品不卡福利 | 国产欧美日韩中文字幕 | 国产成人香港三级录像视频 | 国产成人亚洲精品大帝 | 国产精品边做奶水狂喷无码 | 白丝jk自慰高潮 | 精品久久久久久中文字幕无码漫画 | 东京热av高清在线 | 国产成熟女人 | 国产精品亚洲专区在线观看 | 成人精品午夜在线观看 | 91午夜福利日本视频 | 国产丝袜精品丝袜久久 | 18禁无码无遮挡 | 99国产精品自在自在久久 | 国产精品亚洲一区二区免费 | 国产成人久久久久精品 | 91精品成人a在线观看 | 国产成人mv在线播放 | 2025国产精品视频网站 | 国产成人v一区二区毛片 | 18禁无遮挡爽爽爽无码视 | 精品久久久久久中文字幕无码网站 | 国产精品无码久久sm | 顶级欧美色妇xxxxx香蕉 | 国产成人av综合色 | 国产萌白酱喷水视频在线观看 | 韩国女主播一区二区视频 | av在线天堂网址澳门 | 国产精品无码首页自拍 | 国产精品无码影视久久久久久久 | 国产精品一区在线观看第一页 | 国产午夜福利精品久久 | 国产超薄肉丝袜在线播放 | 91精品国产乱码久久蜜臀 | av麻豆男人的天堂在线观看 | 国产三级野外直播在线 | 激情欧美视频一区二区三区 | 国产精品成人啪免费视频 | 国产二级一片内射视频插放 | av在线观看 | 国产女人喷潮在线观看视频 | 91青青青青国产在线观看 | 国模一区二区三区久久 | a级毛片免费观看片 | 国产亚洲第一精品综合av | 白丝情趣av网站 | 99精品久久毛片a片 99精品久久毛片a片潘金莲 | 国产精品午夜福利在线一区二区 | 国产亚洲综合天天看片 | 91在线网站 | 精品动漫无码在线一区二区三区 | 国产丝袜视频一区二区三区 | 国产福利最新手机在线观看 | 国产精品中文字幕在 | 国产乱xxxxx79国语对白 | 国产精品对白刺激音频在线观看 | 国产午夜精品久久久久99 | 2025国产精品系列一区二区 | 国产成人mv在线播放 | 91精品国产高清91久久久久 | 精品人妻无码一区二区三区蜜桃 | 成人三级视频在线观看不卡 | 国产成人无码区免费aⅴ片老人 | 国产成人精品男人的天堂下载 | 国产91中文在线播放 | 国产亚洲日韩欧美在线 | 国产成人免费āv片在线观看 | 国产午夜亚洲精品不卡福利 | 国产原创一区二区 | 精品人妻无码专区在中文字 | 国产精品国产三级国产av麻豆 | 国产中文字幕91在线 | 精品亚洲成a人片在线观看少妇蜜 | 国产中文字幕精品一区二区三区 | 国产激情视频在线观看 | 91久久九九亚洲一区二区 | av在线免费观看麻豆 | 国产精品一区二区av | 国产欧美高日韩精品久久一区二区 | 国产成人自拍一区 | 国产一区二区四五区在线视频 | 成人精品女人久久久 | 国产亚洲视频中文字幕视频 | 国产精品一区二区av不卡 | 国产一级一国产一级毛片 | 国产黄片第一区二区三区 | av一区二区中文字幕 | 国产精品国内免费一区二区三区 | 国产亚洲欧美在线观看 | 国产精品美女www爽爽爽视频 | 成年午夜无码av片在线观看 | 精品日产一区二区三区手机 | 国产精品日本一区二区不卡视频 | 国产极品美女高潮无套在线 | 国产精品一区二区久久蜜臀内射 | 国产丝袜精品丝袜久久 | 加勒比系列全新探 | 成人在线午夜影院 | 成人欧美精品视频在线观看 | 精品无码久久久久国产一区二区 | 国产98天堂在线看不卡 | 国产精品白浆冒出视频 | 91视频官网国产 | 精品人妻系列无码一区二区三 | 国产成人无码短视频在线观看 | 国产成人精品亚洲一区 | 二区三区手机在线观看 | 91国内自产 | 911国产网站尤物在线观看 | 国产一区视频在线 | 1024在线观看国产天堂 | 精品亚洲一区二区三区在线观看 | av天堂午夜精品一区二区三区 | 国产av在线观看 | 国产精品无码无片 | 成人免费区一区二区三区 | 国产精品免费视频网 | 国产成人精品亚洲日本专区61 | 国产成人精品免高潮在线观看 | 91免费看三级片 | 国产欧美日韩综合一区在线观看 | 国产一区二区野外 | 国产亚洲欧美久久久久 | 99久久精品日本一区二区 | 国产午夜福利白浆一区二区 | 国产高清一级片 | 国产人妻人伦精 | 国产女人在线观看 | 国产福利最新手机在线观看 | 99亚洲中文字幕精品一区二区 | 成人日韩一区在线 | 国产午夜精品理论片久久影院 | 国产成人一区二区在线视频 | 国产无码在线不卡 | 成年性生交大片免费看 | 国产无码高清在线观看av | 高清无码一区 | 高潮流白浆潮喷在线播放视频 | 精品久久福利一区二区 | 国产精品刺激对白一区二区三区 | 国产成人a视频高 | 国产精品一区二区三区四区 | 国产高清精品在线 | 国产91在线精品福利 | 99久久国产精品男女 | 国产日韩精品一区二区在线播放 | av色原在线观看 | 高潮毛片无遮挡高清免费软件 | 国内小情侣一二三区在线视 | 国产区免费在线观看 | 91精品国产人成网站 | 精品国产无套在线观看 | 国产精品不卡一区二区三区 | 国产私密网站入口 | 国产精品黑色丝 | 国产欧美野外性生活 | 国产偷伦视频片在线观看 | 国产精品一区二区免费不卡 | 国产高清不卡无码视频 | 国外成人直播网站 | 国产人妻高清国产拍精品 | 精品毛片高清一区二区 | av在线播放不卡 | 国产在线精品一区二区不卡麻豆 | 潮喷失禁调教sm在线 | 国产aⅴ无码专区亚洲av | 东京一区二区三区高清视频 | 高清无码不卡视频 | 国产一区久久精品福利 | 97色伦图区97色伦综合图区 | 国产做爰xxxⅹ高潮野外 | 2025精品国产综合久久 | 国产三级级在线观看大学生 | av无码中文不卡在线观看 | 精品丝袜永久综合国产 | 91福利免费网站在线观看 | 国产一区二区三区在线看 | 国产综合精品swag | 国产一区二区三区av黄片 | 国产午夜福利三级 | 91久久国产最好的精华液 | 国产紧身 | 国产偷窥熟女高潮精品视频 | 成人一区二区在线 | 国产成人性生交大片免费看 | 国产一二三区视频 | 国产极品美女高潮无套在线 | 国产av人人夜夜澡人人爽麻豆 | 国产精品va无码免费 | av中文字幕综合 | 国产美女精品自在线拍免费 | 国色天香久久精品国产一区 | av老司机av天堂 | 国产精品区一区二区三在线播放 | av亚洲精品毛片av | 国产午夜手机精彩视频 | 国产精品爆乳在线播放第一人称 | 国产原创中文无码精品视频 | 国产三级精品三级在线观 | 丰满爆乳无码一区二区三区 | 国产在线拍揄自揄视频网试看 | 国产三级成人免费 | 3d动漫精品啪啪一区二区中文 | 国产专区校园欧美 | 成人精品丝袜在线一区 | 国产人妻人伦精品无码.麻豆 | 国产系列丝袜熟女精品视频 | 成人欧美一区二区三区1314 | 成人免费观看全部免费 | 97人妻在线播放 | 国产成人综合日韩精品无码 | 97人妻免费公开视频在线看 | 国产真实露脸精彩对白91 | av无码国产在线观看岛国 | 精品视频一区二区三区在线播放 | 国产成人精品高清在线观 | 成人亚洲精品久久久久软件 | 国产三级自拍亚洲色欲色欲 | 国产āv日韩āⅴ亚洲āv无码馆 | 国产成年人精彩视频 | 国产成本人在线观看 | 国产亚洲欧美另类一区二区三 | 国产无码三级在线电影网址 | 91九色在线播放 | 91麻豆精品国产自产在线观看一 | 国产午夜免费视频秋霞影院 | 国产对白精品刺激一区二区 | 99国产精品欲一区二区三区 | 国产成人精品午夜福利 | 精品国产午夜福利精品推荐 | 国产av大毛片一区二区 | 国产爆白浆水真多视频 | 妓女日韩一区二区三区 | 国产成人av电影在线观看浪潮 | 国产精品成久久久久三级四虎 | 国产亚洲中文日 | 国产高清国内精品福利色噜噜 | 国产色诱hd在线观 | 91精品国产综合视频 | 国产成人午夜福利在线播放 | 国产三级精品三级男人的天堂 | 国产精品女人一区 | 国产成人av片无码免费 | 国产精品无码素人福利免费 | 国产午夜精品无码理论片 | 91精品手机国产在线破解版 | 国产av国片精品jk | av片日韩一区二区三区在线观看 | 国产精品视频第一区 | 国产美女精品自在线拍免费 | 国产一区二区三区 | 国产精品入口 | 国产高清美女一级毛片录像 | 精品视频永久免费 | 国产av剧情md精品麻豆 | 国产成人精品999在线观看视频 | 国产无码网页在线观看 | 国产成人片无码免费视频软件 | 国产91区精品福利在线社区 | 国产精品三级久久久久久电影 | 国产精品一二三四区 | 国产精品一区看片 | 精品国产精品va在线观看 | 成人片黄网站色大片免费观看cn | 91精品国产乱码久久久久 | av免费一区二区三区试看 | 成人综合亚洲日韩欧美色 | 国产午夜片无 | 国产精品午夜一区二区欲梦 | 国产麻豆网站 | 国产av精品一区二区 | 国精无码欧精品亚洲一区 | 精品日韩丝袜在线 | 国产成人a亚洲 | 精品视频手机在线观看免费 | 国产精品偷伦视频插放 | 国产精品一区在线观看尤物tv | 精品国产v无码大片在线观看视色 | 国产日韩精品无码一区二区三区 | 成人在线视频 | 成人无码潮喷在线观看 | 国码无码久久99 | 国产麻豆剧传媒精品国产v精品 | 国产高清在线播放免费观看一区 | 国产在线观看福利 | 国产成人综合亚洲亚洲欧美 | 91精品国产高清在线水蜜桃 | 国产自产免费精品一区 | 国产成人无码区免费网站 | a视频全免费网站色窝 | 国产一区二区日韩一区二区 | 国内视频一区在线播放 | 国产成人亚洲精品无码v大片 | 91极品视频 | 成人亚洲国产精品久久 | 国产成人aⅴ在线免费观看 国产成人aa精品一区在线播放 | 高清亚洲日韩av国产精品成人无 | 国精产品一品二品国精在线观看 | av无码人妻精品 | 国产精品制服一区二区 | 国产免费无遮挡吸奶头视频 | 精品人妻少妇一区 | 国产经典自拍 | av夜夜欢一区二区三区 | 国产av一二三四又爽又色又色 | 国产精口品美女乱子伦高潮 | 国产精品国产三级国产三级 | 国产精品亚洲综合的第一页 | 国产91在线播放中文 | 国产亚洲日本一区二区三区久久久 | 国产亚洲精久久久久久无码 | 成人免费午夜在线观看 | 国产午夜福利片 | 国产福利精品久久蜜桃 | 99亚洲中文字幕精品一区二区 | 成人在线免费观看网站 | 国产麻豆精品在 | 2025最新无码国产在线 | 国产成人精品无人区一区 | 国产aⅴ无码专区亚洲av麻豆 | 国产经典系列在线观看 | 国产成人福利在线一区 | 国产超碰āv人人做人人爽 国产超碰女人任你爽 | 国产口爆吞精右线视频 | 国产精品中文综合 | 国产视频在线一区二区三区 | 99ri日韩国产 | 国产麻豆精品高清在线播放 | 精品视频在线免费观看 | 国产成人亚洲精品91专区手机 | 精品国产日韩一区二区三区 | 成人毛片av免费 | 99精品国产综合久久久久五月 | www丁香五月精品国产无码一区 | 国产a级理论片免费播放 | 国产超碰人人模人人爽人人喊 | 成人精品久久久久免费精品久 | 国产日韩一区二区三区高清 | 91久久国产自产拍夜夜嗨 | 东京热heyzo无码专区 | 国产高清一区二 | 国产精品成人久久电影 | 国产午夜亚洲精品一级 | 国产精品成人永久在线 | 18禁日本黄无遮挡免费观看 | 国产av国片精品有毛 | 99精品国产福利一区二区 | 精品一区二区国语对白 | 不卡高清av手机在线观看 | 国产高清在线观看麻 | 99国产欧美精品久久久蜜芽 | 国产亚洲精aa在线看 | 国产午夜无码片在线观看网站 | 韩国高清无码久久av | 国产夫妻一区二区 | 91精品综合久久久久五月天 | 18禁黄无码免费网站高潮 | 成人毛片无码一区二区三区 | 国产一线天粉嫩馒头极品av | 91麻豆精品国产专区在线观看 | 国产福利秒拍一区二区在线观看 | 国产成人年无码av片在线观看 | 精品国产免费第一区久久 | 1000部无遮挡拍拍拍免费视频 | 国产精品区一区二区三在线播放 | 91视频网或将从此无大神 | 国产精品老牛影视 | 国产女人十八毛片a级毛片 国产女人视频一区二区 | 精品亚洲国产成人蜜芽av小说 | 国产午夜精品一区二区三区漫 | 国产99精品老女人免费观 | 国产美女嘘嘘嘘嘘嘘视频 | 国产黄a一级二级三级看三区 | 国产午夜无码精品 | 韩国福利影视一区二区三区 | 国产成人综合在线观看网站 | 岛国av一区二区无码 | 国产成人综合久久精品直播 | 3d动漫精品啪啪一区 | 东京热人妻无码一区二区av | 后入内射视频 | 丰满人妻av无码一区二区 | 国产精品成人观看视频 | 风流少妇按摩来高潮 | 18禁美女黄网站色大片免费 | 岛国av无码精品一区二区三区 | 国产睡熟迷奷系列精品视频 | 2025国产精品国产精华 | 国产欧美日韩中文字幕第一页 | 国产高潮又爽又刺激的视频 | 国产aⅴ一二三区无码视频 国产aⅴ一区 | 国产精品一区二区在线俏佳人 | 国产成人精品午夜福 | 国产三级野外直播在线 | 国产成人av国语在线观看18 | 国产a一级毛片精品高清乱码 | 国产精品一区二区 | 国产亚洲欧美日韩综合一区二区 | 国产精品一区二区av | 成人三级a视频在线观看 | 2025高清一区二区三区 | 成人国产中文字幕 | 国产69堂一区二区三 | 精品人妻码一区二区三区 | 国产成人午夜 | 精品国产经典三级在线看 | 国产巨作麻豆欧美亚洲综合久久 | 国产女人喷潮视频在线观看 | 91精品久久国产青草 | 国产高潮成人免费视频在线观看 | 精品亚洲a∨在线播放不卡 精品亚洲aⅴ无码午夜在线 | 精品午夜福利无人区乱码一区 | 国产三香港三韩国三 | 国产隔着超薄丝袜进入 | 国产精品亚洲夜色在线 | 国产大片中文字幕 | 国产aⅴ精品一区二区三区久 | 91久久亚洲国产成人综合精品 | 国产午夜精品美女免费大片 | 国产三片理论电影在线 | 成人精品国产成人亚洲 | 国产成人无码精品久久久露脸 | 国产精品制服丝袜视频 | av片免费大全在线观看不卡 | 国产aⅴ精品一区二区果冻 国产aⅴ精品一区二区久久 | 东京热在线 | 国产精品专区在线免费观看 | a级毛片免费全部播放经典 a级毛片免费全部播放无码 | 国产v亚洲v天堂无码久久久 | 国产无套内射普 | 成人欧美亚洲另类日韩 | 国产a级毛片久久精品电影 国产a级毛片久久久精品毛片 | 91麻豆最新在线人成免费观看 | 国产高清毛片 | 国产午夜福利精品久久2025 | 国产欧美日韩制服丝袜三区 | 国产高潮抽搐喷浆a精品视频 | 国产精品va在线观看无码不卡 | 国产精品乱码一区二区 | 囯产精品不卡无码av在线播放 | 国产精品无码久久久最线观看 | 国产精品福利视频导航 | 91精品国产亚洲爽啪在线观看 | 国产精品三级av及在线观看 | 国产精品熟女一区二区三区 | 国产美女午夜区一区二区三区 | 国产欧美精品国产国产专区 | 国产成人精品.一二 | 99精品人妻无码专区在线视频 | 极品尤物国产在线播放 | 国产成人无精品久久久久国语 | 国产精品秘入口一区二区 | 国产成人av综合亚洲 | 国产内射大屁股白浆一区二区 | 国产偷窥熟女精品 | 国产成人综合亚洲精品 | 97涩涩免费视频在线 | 国产成本人在线观看 | 2025亚洲中文字幕 | 国产日韩高清制服一区 | 国产内射大屁股白浆一区二区 | 国产91精品一区二区麻豆亚洲 | 成人3d动漫一区二 | 国产成人免费高清直播网站 | 国产一区二区三区久久精品 | 国产精品伦视 | 国内免费无码自拍视频网 | 国产av国片精品一区二区 | 国产成人5x人网站视频 | 风韵丰满熟妇啪啪区老熟熟女 | 国产无码在线不卡 | 成人电影一区二区 | 国产成人精品一区 | 精品无码专区免费播放 | 成人黄网18免费观看的网站 | 白嫩少妇高潮喷水惨叫 | 国产精品在线亚洲手机视频 | 国产精品成人av在线不卡 | 国产精品狼人久久久久影院 | 韩国午夜福利理论片在线观看 | 国产成人av无码片在线观看 | 国产一级毛片一区二区三区 | 成人无码精品一区二区三区亚洲区 | 国产日韩免费视频在线观看 | av片在线观看 | 国产一区二区日韩欧美在线 | 国产精品一区二区三区久久 | 国产va欧美va在线观看 | 精品亚洲成a人片在线观看少妇 | 国产亚洲欧洲日韩在线91区 | www夜片内射视频日韩精品成 | 国产精品视频一区二区色戒 | 国产三级精品美女三级 | 国产成人综合一区精品 | 成人精品高清在线观看 | 果冻传媒视频在线播放 | 91极品女神私人尤物在线播放 | 国产欧美视频一区二区三区 | 国产精品高清免费网站 | 精品无码一区二区三区在线 | 国产激情视频在线观看性色 | 国产成人无码区免费内射一片色 | 国产精品视频一区二区首页 | 国产成人片无码 | 国产精品亚洲av色欲在线观 | 国产精品直播手机在线 | 国产精品原创巨作在线影院 | 国产成人影院一区二区三区 | 91国内外精品自在线播放 | 精品三级久久久久电影网 | 99国产精品视频播放 | 国产高清精品一区二区不卡 | 激情伊人五月天久久综合 | 国产麻豆一精品一av一免费软件 | 精品麻豆国产色欲色欲色欲www | 国产日韩欧美一区二区东京热 | 国产v亚洲v天堂a无码99 | 国产成人手机在线 | 91在线国偷自产一区国产永久 | 东京热一区二区三区 | 国产成人视频在线观看 | 国产福利在线免费观看 | 99久久这里只有免费精品 | 国产成人a视频高清在线观看 | 18禁黄污吃奶免费看网站 | 精品国产黄页网站在线观看 | 精品少妇人妻av无码专区偷人 | 国产一级毛片久久av | 国产av无码专区亚洲av草草 | 国产成人高清一区二区私人 | 国产精品视频一二三四五 | 国产精品制服丝袜一区 | 国产午夜成人无码免费看不卡 | 国产欧美日韩综合精品二区久久 | 爆乳美女娇喘视频在线观看 | 国产成人无码va在线观看 | 国产精品毛片v一区二区三区 | 成年午夜免费aⅴ在线观看 成年午夜无码av片在线观看 | 国产私密网站入口 | 国产午夜精品免费一区二区 | 成人免费无码精品国产电影同人 | 成人欧美一区二区三区在线视频 | 黑人巨大精品欧美一区二区蜜桃 | 99久久国产综合精品麻豆 | av无码专 | 国产午夜小视频 | 国产午夜在线看免费观看视频 | 国产精品无码手机在线 | 国产成人秘在线 | 国产精品一级无遮挡毛片 | 国产一区二区三区美女秒播 | 国产欧美日韩视频在线不卡 | 国产免费又色又爽又黄的视频 | 国产小视频你懂的在线欧美 | 2025久久老司机福利精品网 | 国产无套无码aⅴ在线观看 国产无套在线播放 | 国产主播一区二区三区在线观看 | 国产无码又粗又长色网视频 | 国产精品一区二区无线 | 国产女人喷浆 | 国产美女三级片视频 | 国产成人亚洲精品无码h在线 | 精品国产仑片一区二区三区 | av无码免费一区二区三区 | 国产成人无码www免费视频在线 | 国产精品九九一区视频 | 国产一区二区免费视频 | 变态另类区sm一区 | 国内精品无码一区二 | 国产二区啪啪视频 | 国产偷窥熟女精品视频大全 | 国产人妻人伦精品无码.麻豆 | 国产偷窥熟女高潮精 | 成人版菠萝蜜视频在 | 精品蜜臀国产aⅴ一区二区三区 | 国产真人无码免费视频 | 国产精品观看在线播放 | 国产成人无码精品 | a人片a级毛片在线观看 | 国产3p精品一区二区三区 | 国产精品免费观看 | 国产精品国产三级国产av品爱 | 精品久久久久久婷婷 | 国产a级作爱片无码高级 | 91av一区| 国产麻豆剧果冻传媒一区 | 精品国产一区二区国产精品国产 | 国产v综合v亚洲欧美大另类 | 国产成人一区二区三区动漫 | 国产三级在线观看视频不卡 | 精品国欧美一区二区三区 | 国产精品高潮呻吟久久av无码 | 国产成人无码一二三区视频 | 国产aⅴ一二三区无码视频 国产aⅴ一区 | 国产在线精品二区 | 国产三级直播在线播放直播 | 国产精品青草综合久久久久99 | 99精品国产一区二区三区a片 | 国产精品高清一区二区不卡 | 精品蜜桃一区二区三区 | 国产精品视频大全 | 国产三级国产三级欧美三级 | 国产成人久久av免费高清 | 18禁成年无码免费网站无遮 | 国产成人在线播放免费视频 | 2025在线精品自偷自拍无码 | 丰满无码人妻束缚无码区 | av无码人妻一区二区三区在 | 国产在线你懂的网址深夜福利 | 国产精品无码久久久 | 国产精品伊人久久免费视频 | 国语高清在线视频二区 | 国产一本大道香蕉大在线 | 国产高清一卡2卡3卡4卡乱码 | 国产成人久久精品一区二区三区 | 国产成人av一区二区在线观看 | 国产精品丝袜综合区另类 | 国产无码啪啪视 | 国产一区二区三区成人欧美日韩在 | 国产午夜精品1区2区3福利 | 国产精品va在线观看无码 | 国产一区二区三区四区五区不卡 | 国产精品久线在线观看 | 国产一级aⅴ无码毛片 | 国产日韩无码中文字幕在线综合 | 国产精品麻豆a啊在线观看 国产精品麻豆v | 国产亚洲欧美观看在线一区 | 91麻豆va国产精品久久久久久 | 国产人妻综合免费观看影院 | 国产精品视频一区二区三区四 | 国产99精品| 精品日本亚洲18 | 2025久久国自产拍精品 | 成年无码av片大全在线播 | 国产呦萝小初 | 国产97人人乐人人爱 | 91午夜福利国产在 | 国产精品高潮在线 | 韩国女主播一区二区视频 | 国产尤物一区二区三区在线观看 | 国产成人av激 | 国产一区二区三区四区五区vm | 91精品啪在线观看国产色 | 国产精品你懂的在线资源观看 | 国产专区亚洲欧美另类在线91 | 国产美女牲交视频 | 韩国午夜福利理论片在线观看 | 精品毛片无码波多野结衣 | 调教女孩自慰网站免费观看 | 高清欧美日韩一区二区三区在线 | 超级乱淫片午夜电影网福利 | 国产自拍成人激情视频 | 国产av中文字幕乱码高清 | 国产精品无码国模私拍视频 | 国产无套乱子伦精彩是白视频 | 国产精品成人观看视频国产 | 国自产精品手机在线视拍 | 国产欧美日韩视频在线观看 | 国产女主播在线播放一区二区 | 国产成人精品亚洲午 | 福利精品老师国产自产在线 | 国产v亚洲v天堂无码果冻传媒 | 国产在线视频一区二区三区98 | 99久久久精品免费观看国产 | www夜插内射视频网站 | 激情人妻偷乱在线视频 | 国产高清情侣高潮露脸 | 精品国产高清欧美操b视频 精品国产高清一区二区广区 | 精品人妻大屁股白浆久久 | 国产aⅴ久久免费精 | 国产精品九九久久中文 | 18禁无码永久免费无限制 | 高潮毛片激情久久 | av无码精品一区二区三区四 | 国产大波视频在线播放 | 国产精品亚洲久久久久 | 国产精品成人一区二区三区电影 | 成人国产免费av一区二区三区 | 国产巨作麻豆欧美亚洲综合久久 | 国产97人人乐人人爱 | 国产一级无码av免费久久 | 91丝袜在线观看亚 | 国产无套粉嫩白浆在线 | 国产精品亚洲欧美日韩在线播放 | 国产高清精品二区 | 丰满少妇一区 | 91精品一区二区三区在线播放 | 国产精品系列在线一区 | 2025国产精品最新在线 | 国产主播福利精品中文 | 国产精品白丝av在线观看播放 | 国产激情一区二区三区成人91 | 精品人妻va出轨中文字幕 | 国产高清在线观看视频手机版 | 国产成人av在线婷婷不卡 | 国产区精品在线2025 | 国产日韩另类视频一区爱 | 韩国精品一区二区三区四区 | 国产中文字幕在线观看视频 | 国产成人综合久久精品推最新 | 69国产成人综合久久 | 超大乳抖乳露双乳呻吟电影 | av在线播放无码线 | 国产va无码高清 | 国产尤物在线视精品亚洲 | 国产一级内射高清视频在线观看 | 1000部黄片免费观看一区 | 国产麻豆蜜桃色精 | 69天堂人成无码麻豆免费视频 | 国产精品成人av三级在线 | 精品久久无码久97影院 | 国产在线一区二区三区旡码 | 国产精品无码综合区 | 国产av激情久久无码天堂 | 国产喷水aⅴ | 国产在线播放成人午夜精品 | 成人做受视频试看120秒 | 成人免费一区二区三区视频 | 国产91在线精品国自产在线 | 国产精品午夜男女大片免费看 | 国产精品探花一区在线观看 | 91精品综合在线视频 | 国产成人久久综合一区77 | 国产成人无码a区电影 | 成人综合另类日韩国产欧美 | 国产成人精品无缓存在线播放 | 国产精品视频观看 | 精品少妇无码v无码专区 | 国产精品人成a片一区二区 国产精品人成a片一区二区下载 | 97人妻精品一区二区三区 | 国产超碰97久久人人操人人操 | 国产av午夜福利写真电影 | 国产精品日本亚洲77 | 国内精品一区二区三区 | 国产偷亚洲电影在线观看网址 | 91精品午夜福利在线观看入口 | 国产成人综合久久网站 | 国产激情久久久久99蜜桃 | 国产精品国语自产 | 国产+日韩+另类+视频一区爱 | 国产精品视频第一区二 |