欧美日韩亚-欧美日韩亚州在线-欧美日韩亚洲-欧美日韩亚洲第一区-欧美日韩亚洲二区在线-欧美日韩亚洲高清精品

金喜正规买球

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@fc6vip.cn

文章轉載自:IT專家網

為你推薦

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


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
熟女一区二区 | 欧美精品视频免费看 | 日本一本 | 三级视频| 国产亚洲精品a在线观看 | 成人午夜视频一区二区国语 | 在线观看国产三 | 午夜影视免费体验区一分钟 | 国产+欧美+激情 | 海角国精产品一区一区三区糖心 | 国产在线观看国语对白 | 亚洲精品国产精品 | 中文日产乱幕九区无线码 | 午夜福利理论片在线观看 | 欧美、另类亚洲日本一区二区 | 午夜福利国产在 | 中国在线观看免 | 色两性网欧美 | 亚洲一本之道高清在线观看 | 中文天堂最新版在线网 | 亚洲欧美中文字幕无线 | 青青草国产精品视频 | 2025年国产中文字无 | 国产免费观看视频 | 国产一区二区三区不卡在线 | 亚洲男人第一天堂 | 飘雪免费手机全集在线观看 | 国产自在现偷国产精品国产日韩 | 日本成本人片视频免费 | 欧美日韩亚 | 欧美区一区 | 亚洲人成电影院在线观看 | 性xxxxx欧美| 在线观看国产高清免费不卡黄 | 91精品啪国产在线观看 | 韩国在线观看日韩免費資訊 | 国产黄在线观看免费观看网站不卡 | 激情精品一区二区在线观看 | 99re在线这 | 国产盗摄精品一区二区三区 | 国产一级一片免费播放放 | 日本不卡高清在线 | 日本三级精 | 欧美日韩激情 | 欧美人与动性行为网站免费 | 亚洲欧美国产日韩精品在线 | 国产尹人香蕉在线观看 | 中文字幕一区二区三区日韩精品 | 欧美日韩视频网站 | 欧美日韩亚洲二区在线 | 亚洲春色一区 | 国产一区在线视 | 69xxxxx中国女人 | 人成免费 | 日本中文字幕aⅴ高清看片 午夜色大片在线观看 | 国产一级特黄aa大片在线观看 | 国产亚洲精品片a77777 | 日本三级全黄三级a | 日本最新免费不卡二区在线 | 最新电视剧免费在线观看 | 国产在线国偷精品产拍 | 日韩午夜在线 | 国产欧美日韩在线一区二区不卡 | 色老头在线永久免费视频 | 免费最新电视剧 | 亚洲成a人片在线不卡一二三区 | 国产99视频精品免费观看6 | 欧美一区二区三区婷婷月色 | 亚欧国产一级在线免费 | 丝袜视频国产手机在线 | 日韩精品男人的天堂 | 欧美一区二区三区免费看 | 亚洲日韩aⅴ小电影 | 亚洲网站在线观看人成 | 国产又粗又爽视频 | 亚色九九九全国免费视频 | 久9视频这里只有精品8 | 青青综合 | 国产播放隔着超 | 国产丝袜护土调 | aaaaa级少 | 日韩欧美国产精品 | 国产成视频| 极速影院 | 日韩aⅴ黄日韩a影片 | 欧美日韩一区二区 | 国产综合色在线视频播放线视 | 国色天香中文在线观看www | 射射影院 | 国产亚洲精品综合一区 | 欧美日韩产精品自在自线 | 国产全肉乱妇杂乱视频 | 国产高清视频免费在线观看 | 亚洲欧美日韩中文播放 | 亚州精品永久观看视频 | 三级高清在线 | 丰满岳乱妇一区 | 亚洲欧美日韩另类中文字幕组 | 国产精品自产拍在 | 国产精品亚洲一区二区在线观看 | 精品国产自在现偷99精品 | 欧美一级毛卡片免费2025 | 国产乱码高清区二区三区在线 | 最新全网影视大全电影电视剧 | 亚洲精品夜夜夜 | 亚洲一区二区国产日韩欧美 | 一本大道香蕉久97在线播放 | 青青青国产 | 成人国产综 | 91精品网站天堂系列在 | 国产精品网站在线观看免费传媒 | 日本91视频 | 日韩欧美中文综合 | 会议电话| 另类国产精品一区二区 | 91高清在线 | 不卡一卡 | 中文字幕精品一区二区三区在线 | 国产亚洲一区在线 | 老熟女高| 91po国产在| 欧美多人顶级午夜寂寞影院 | 户外露出在线 | 国产精品主播在线 | 国产精品一区二区视色 | 大地影院高清mv在线观看 | 91最新人成在线观看 | 亚洲国产精品 | 男女xxⅹ爽免费视频 | 国产精品午夜免费观看网站 | 羞羞影院午夜男女爽爽视频免费 | 亚洲综合一区二区三区 | 国产精品人成在线播放 | 国产午夜免费视频 | 亚洲精品国产 | 国产乱子伦午夜视频观看 | 国产精品欧美亚洲区 | 亚洲天堂国产视频 | 日本免费在线 | 又粗又大又黄又爽的免费视频 | 国产手机在线观看视频 | 2025最新在线观影网站 | 国产大片b站免费观看推荐 国产91尤物在线观看互 | 中文字幕精品一二三四五六七八 | 朋友的妈妈2在完整有限中字第 | 国产盗拍精品视频 | 亚洲熟肉一区二区三区 | 国产自国产自愉自愉免费24区 | 亚洲欧美精品一中文字幕 | 中文版精 | 欧洲动漫精品专区一区二区三区 | 亚洲中字幕日产aⅴ | 观看美国 | 尤物精品视频一区二区三区 | 手机在线电影 | 91进入蜜| 一级特黄h厂视频网站 | 欧美亚日韩国产aⅴ精品中极品 | 日本高清视频在线观看不卡 | 99视频| 人操人碰 | 亚洲国产一区二区在线免费 | 神马家庭影院 | 国产精品一区二区三 | 日韩欧美亚洲一区二区综合 | 91成人精品一区二区三区四区 | 亚洲一区激情校园小说 | 中字幕视频在线永久在线观看免费 | 影视大全网| 亚洲国产在线精品国偷产拍 | 国产一区在线视 | 国产视频一区二区三区四区 | 国产精品色一区二区三区 | 丁香美女社区 | 91免费网址 | 日韩免费在线 | 国产精品免费大片 | 扒开腿挺进肉嫩小泬喷水网站 | 开心五月丁香花综合网 | 国产欧美一区二区三区户外 | 神马影院午夜电影 | 99热国产在线播放只有精品 | 亚洲国产精品自在拍在线播放蜜臀 | 亚洲欧美中文字幕专区 | 香蕉香蕉国产片一级一级毛 | 中文字幕国产日韩 | 日韩伦理电影中文在线 | 亚洲二区在线观看 | 乱码高清在线观看 | 亚洲国产欧美日韩精品一区二 | 欧美一区二区三区婷婷月色 | 国产精品一二三区日韩免费 | 亚洲精品网址在线观看 | 欧美日韩视频一区二区三区 | 国产特黄精品一区二区在线 | 中文字幕日韩wm二在 | 欧美日韩亚洲国 | 中文字幕在线影院 | 最新电影电视剧免费在线观看 | 美女视频黄频a美女大全 | 亚洲动作一 | 国产在线一区二区三区在线 | 欧美视频人人干人人 | 新午夜电影网 | 欧美日韩免费高清一区二区 | 精品国产一区二区三区 | 国产精品自在拍在线播放 | 欧美日韩变态另类在线观看 | 国产欧美日韩精品在线观看 | 腿露私下 | 欧美综合视频在线观看 | 国产精品亚洲αv三区 | 欧美性猛交xxxx黑人 | 丝袜一区在线 | 污污污免费视频 | 亚洲欧美精品日韩片 | 网站在线观看 | 国产91视频网 | 国产农村妇女精品一二区 | 国产高清在线精品一区小说 | 国产日韩欧美日韩欧美 | 亚洲欧美在线x视频 | 国产系列丝袜熟女精品网站 | 国语自产精品视频在线看 | 中文字幕精品亚洲无线码二 | 国产拍偷 | 亚洲人和日本人jzz视频 | 成人精品视频一区二区三区 | 最新天美传媒 | 欧美日韩一区二区三区视频 | 嫩小槡bbbb槡bb | 欧美日韩国产免费一区二 | 国产伦精品一区二区三区视频金莲 | 亚洲欧美日韩精品永久 | 天堂中文在线最新版地址 | 处女的诱惑在线观 | 亚洲精品在看在线观看 | 精品一区二区三区密臀在线 | 视频一区二区三区在线看 | 欧美日韩视费观看视频 | 亚洲男女在线 | 中文字幕国产专区99 | 亚洲精品国产suv一区 | 日韩欧美综合在线二区三区 | 丰满在线观看 | 污污污污污www网站免费观看 | 两个人看的www视频免费完整版 | 国产精品高清一区二区三区 | 日韩欧美天堂 | 午夜a级理论片在线播放 | 老司机导航在线观看 | 国产免国产免费 | 一本大道香蕉久97在线播放 | 亚洲精品一级高清在线播放国 | 国产精彩视频一区二区在线观看 | 欧美日产欧美日产精品 | 99热在| 欧美性猛交xxxxxxxx | 国产精品亚洲欧美高清 | 国产日产精品 | 国产乱理伦片在线午夜观看 | 中美日韩亚洲中文专区小说 | 国产乱子伦高清对白 | 女人脱精光一清二楚图片 | 精品日韩在线一区二区 | 手机看片1024欧美日 | 欧美日韩成人在看 | 亚洲综合欧美 | 成人午夜看片在线观看 | 最新欧美精品一区二区三区 | 一起碰一起噜一起 | 亚洲国产综合在线 | 国产在线精品免费一区二区三区 | 欧美日韩中文国 | 不卡影片 | 亚欧成人中文字 | 欧美激情亚洲专区一区二区 | 免费福利电影 | 亚洲人成图片小说网站 | 不止不休高清在线观看 | 国产在线观看免费人成视频 | 国产黑色丝袜在线观看下 | 亚洲国产精品va在线观看无 | 国产su| 91秦先生久 | 2025卡1卡2卡3精品老狼 | 欧美亚洲国产日韩精品在线观 | 欧洲动漫精品专区一区二区三区 | 国产欧美va欧美va香蕉在 | 99ri视频一区二区三区 | 青青青在线播 | 熟女一区中文字 | 免费视频精 | 五月丁香婷婷综合影院 | 秋霞国产午夜 | 中文字幕日本精品一区二区三区 | 亚洲欧美自偷自拍另类视 | 国产在线精品香蕉综合网一区 | 国产综合精品一区二区 | 日韩精品一区二区三区在线观看 | 九一看片| 欧美视频一区二区三区 | 国产成a人 | 欧美特黄一级大黄录像 | 国产精品成人免费 | 日韩欧美一区二 | 欧美人与性动交 | 国产精品最新高清 | 亚洲欧洲专线 | 欧美一级精品视频一区 | 国产视频一区在线观看 | 2025最流行电视剧 | 日本高清免费不卡视频 | 亚洲午夜成人精品电影在线观看 | 国产精品60岁老女人 | 欧美推油无尺码 | 国产高清视频色拍 | 奶水国产在线播放 | 亚洲欧美日韩在线一区 | 国产欧美日本亚洲精品一4区 | 日皮视频免费观看 | 国产精品99在线观看 | 国产日韩欧美福利 | 天堂va视频一区二区 | 杨幂在日本一区二区视频 | 亚洲精品字幕在线观看 | 国产精品成人aaaa网站女吊丝 | 亚洲国产精品成人天堂 | 亚洲精品国产制服丝袜美腿 | 亚洲永久精品一二三网址永久导航 | 亚洲欧美偷拍另类a∨ | 亚洲精品无播放器在线播放 | 影院热映大片 | 国产日韩在线视频 | 色一情一乱一乱一 | 国产伦精一品二品三品 | 成人精品| 乌克兰18极品xx00喷水 | 禁止18岁啪 | 国产精品亚洲a∨天堂 | 国产精品一区二区三区四区 | 国产一区二区三区免费 | 国产网友愉拍精品视频手机 | 国产精品免费精品自在线观看 | 亚洲欧美日韩国产精品一区二 | 国产一区二区三区亚洲 | 国产亚洲精品福利在线无卡一 | 视频一区二区三区免费观看 | 亚洲精品一区二区三区视频在线观 | 91国自啪| 精品国内自产 | 国内在线不卡视频 | 欧美日韩精品国产—区在线 | 亚洲人成电影在线观看天堂色 | 亚洲无人区码卡二卡三卡四卡 | 欧美一级鲁丝 | 欧美、另类亚洲日本一区二区 | 亚洲精品无播放器在线播放 | 亚洲+欧美+日韩+综合aⅴ | 国产日韩在线欧美视频 | 国产亚韩欧美联合在线 | 国产a∨天天免 | 91香蕉成人 | 亚洲欧美中文日韩v在线 | 羞羞影院午夜男女爽爽视频免费 | 国产精品网站在线观看免费传媒 | 日韩经典欧美 | 亚洲男人的天堂在线va拉文 | 欧美日韩精品 | 亚洲欧洲欧美中文日韩 | 亚洲色中文字幕在线播放 | 亚洲一本大道中文在线 | 国产v综合v亚洲欧美大另类 | 国产精品自拍亚洲 | 日本亲子乱子伦xxxx | 91国内揄拍 | 精品国产制服丝袜高跟 | 国产精品视频高清在线播放 | 国产亚洲天堂 | 在线视频有码国产欧美 | 国产91丝袜在线播放0 | 成人污污污www网站免费丝瓜 | 亚洲欧美小说 | 欧美日韩一区二区不卡在线播放 | 国产一级二级三级经典在线 | 真实国产乱子伦 | 午夜成人亚洲理伦片在线观 | 黄+片在线免费观看+精品+巨 | 精品国产制服丝袜高跟 | 国产伦理一区二区 | 欧美丰满熟 | 二区高清 | 福利在线免费 | 亚洲专区在线 | 国产一级一片免费播放视频 | 国产美女精品视 | 中文字幕精品视频第一区第二区 | 精品国产日韩亚洲一区在线 | 国产亚洲人成网站在线观看不卡 | 日韩欧美国产精品免费一二 | 亚洲经典 | 微博网红户外露出在线观看 | 欧美天堂 | 亚洲国产精品91 | 国产色产综合色产在线观看视频 | 免费人成黄页网站大全在线观 | 国产亚洲成aⅴ人片在线观看 | 91国偷自产中文字幕婷婷 | 日韩欧美a级 | 国产极品翘臀在线观 | 天天天天躁天天爱天天碰2025 | 91全网在线观看国产 | 99这里只有精品在线观看视频播 | 中文日本免费高清 | 日韩一区二区三区免费视 | 国产精品自在自线国产午夜 | 亚洲国产精品一区第二页 | 为您呈现最新最热的电影力作 | 偷窥xxxx | 国产高清| 91看片淫黄大片在看 | 亚洲无线观 | 欧美中文字幕乱伦视频 | 欧美性猛交ⅹxxx乱大交 | 亚洲日韩欧美一区二区三区在线 | 高清影视电视剧在线观看 | 综合三级中 | 欧美日韩国产精品视频 | 国内精品免费 | 动漫h在线观看 | 国产一级一级一级国产片 | 精品国产一区二区三区香 | 老色鬼在线精品视频 | 国产欧美一区二区三区户外 | 欧美精品亚洲精品日韩专 | 亚洲亚洲人成网站在线观看 | 91啦视频在线观看 | 日本xxxxx在线观看 | 成人国产精品 | 国产午夜亚洲精品午夜鲁丝片 | 全部视频欧美日韩在线无人 | 亚洲欧美中文字幕在线一区 | 99视频精品国在线视频艾草 | 国产欧美日本在 | 老司机成人亚洲精品影院 | 亚洲第一区欧美国产不卡综合 | 亚洲欧美韩国三级 | 亚洲成年人影院 | 成年女人看片 | 日韩欧美另类一区二区三区 | 欧美精品一区二区三区 | 国产aⅴ| 日韩欧美在线综合va网 | 国产精品自在线拍国产手机版 | 亚洲精品在线免费 | 午夜视频在线观看国产 | 日韩精品一区二区三区在线 | 国产一区二区三区日韩精品 | 欧美yw精品日本国产精品 | 亚洲第一 | 国产极品视频一区二区三区 | 精品福利一区二区三区免费视 | 亚洲五月天综合 | 亚洲日韩中文字幕 | 免费特级婬片高清视频 | 国产一级特黄大片特爽 | 亚洲国产不卡一区二区三区 | 国产日本欧美在线观看乱码 | 在线观看午夜福利院视频 | 国产高清不卡在线 | 2025免费高清电影大全 | 日本精品久 | 国产日韩欧美视频网址 | 欧美日韩在线亚洲 | 少女哔哩| 欧美激情αv一区二区三区 国语在线看免 | 中文字幕精品一区二区精品 | 国产午夜成福利在线观看 | 忘忧草日本高清频道 | 骚女影院| aaa午夜级特黄日本大片 | 乱仑图片| 被暴雨淋湿 | 亚洲欧洲自拍偷线高清一区二区 | 成人性生交大片在线观看 | 91国内自产| 国产乱码精品一品二品 | 亚洲色偷拍 | 国产自拍偷拍在线一区二区 | 欧美特黄a级 | 精品福利一区二区三区免费视 | 综合欧美日 | 男人精品一线视频在线观看 | 国产精品专区第二 | 天天综合网天天综合色 | 日本一区二区免费在线播放 | 欧美韩日二三在 | 扒开女人内裤猛 | 国产jizzjizz免费看 | 日产国产精品日韩精品 | 国产ol丝袜高跟在线观看不卡 | 亚洲成a人片在线观看 | 国产福利91精品一区二区 | 国产日韩中文字幕 | 午夜国产小视频 | 草莓视频在线免费看 | 最近高清中文字幕免费mv视 | 国产成年女人特黄特色大片免 | 女人喷液在线观看免费 | 老司机免费精品线观看86 | 玖玖国产在线 | 国产自偷自偷免费一区 | 成人性午夜视频在线观看 | a大片高清在线观看 | 亚洲高清一区二区三区不卡 | 免费在线播放 | 亚洲午夜成人精 | 欧美一区二区三区四区国产另类 | 精品欧美亚洲影视 | 国产麻传媒精品国产v | 午夜福利电影网 | 日本亚洲精品成人 | 亚洲激情午夜福利色色色 | 2区3区在线观看 | 中文字幕在线日亚州9 | 精品国产午夜福利在线观看 | 日本精品二三区视频在线观看 | 免费成人黄 | 水莓100免| 日本激情猛烈在线看免费观看 | 免费国产在线精品一区二区 | 国产精品一区二区制服 | 亚洲一区日韩高清中文字幕亚洲 | 亚洲欧美大码a在线观看 | 日本中文字幕一区二区视频 | 国产精品视频免费网站 | 91情国产l精品国产亚洲区 | 亚洲一区二区在线欧洲 | 国产精品人成在线播放 | 国产精品美乳在线观看 | 亚欧洲乱码视频在线专区网站 | 国产乱子伦不卡视频 | 国产99对白在线播放 | 欧美日韩国产激情电影 | 国产亚洲91精品色在线 | 奇米网7777 | 日韩成a | 国产美女一区二区丝袜美腿 | 国产乱对白刺激视频不卡 | 秋霞网国产 | 中文字幕人成乱码在线观看 | 午夜小电影 | 免费无毒片在线观看 | 电影大全 | 欧美校园激情清纯另类 | 国产一区二区精品久电影 | 午夜激情影 | 日本高清不卡一道免费观看 | 国产精品色三级在线观看 | 成人亚洲性情网站w | 日本精品在线一区欧美 | 中文字幕日韩一区二区三区不卡 | 欧美在线精品亚洲综合网 | 亚洲综合色区激情自拍 | 二三区成人影片 | 一区二区三区蜜桃 | 天堂va视频一 | 国产乱人免费视频 | 国产a国产国产片 | 国产精品自拍视频 | 日本成a人片在线观看网址 国产精品蜜桃丝袜 | 亚洲精品视频一区二区 | 日韩精品不卡 | 亚洲国内自拍愉拍中文字幕 | 国产精品碰碰现在自在拍 | 91视频精品久 | 日本aⅴ日 | 国产精品污www在线观看 | 中文字幕永久在线日本高清dvd | 精品国产免费一区二区三区香 | 日韩精品在线视频一区二区三区 | 国产欧美日本亚洲精品一5区 | 日本高清不卡一道免费观看 | 国产成+| 亚洲精品美女偷拍一区二 | 国产97视| 国产午夜电影在线电影 | 欧美中日韩免费观 | 国产精品综合色区在线观看 | 精品免费美剧网排行榜在线看 | 欧美日韩亚洲国 | 国产偷国产偷亚洲高清日 | 国产大码无尺度视频在线 | 欧美国产精品免费观看 | 敌伦交换一区二区三 | 九九线精品视频在线观看视频 | 国产在线观看中文字幕 | 日韩一区二区三区视频在线观看 | 日韩亚洲欧美三区中文字幕 | 中日韩精品视频在线观看 | 中日韩精品视频在线观看 | 国产精品日 | 欧洲亚洲一区二区三区 | 欧美va日本va亚洲ⅴa | 神马影院韩国 | 亚洲精品在线中文字幕 | 日韩a∨精品一区二区三区 国产亚洲视频中文字幕97精品 | 亚洲精品欧 | 亚洲综合激情五月丁香六月 | 日韩精品一区二区三区中文不卡 | 美女被肏翻白眼视频在线观看 | 神马影院午夜电影 | 亚洲国产在线精品国偷产拍 | 国产中文字幕不卡在线观看 | 亚洲综合偷拍一区二区三 | 人在线播放 | 欧洲精品亚洲一区 | 亚洲天堂激情在线看 | 成人国产精品免费视频 | 国产极品精品免费视频能看 | 国产在线播放成人免费 | 欧美日韩国产精品视频 | 久操免费在线 | 女人国产香 | 午夜一区一品日本 | 老女人擦 | 每日更新国产精品视频 | 牛牛视频一区二区三区 | 日本免费一区二区三区在线视频 | 国户一区二区免费视频 | 免费国产黄线在线观 | 亚洲一区二区三区不卡精品 | 99国产在线精品国自产在 | 亚洲熟女精品一区二区成人 | 午夜福利一区二区三区不 | 人人澡人人澡人人 | 精品一线二线三 | 蜜桃网址 | 岛国大片网站在线观看 | 日本一区二区三区视频在线 | 清除唯美 | 日韩精品亚洲人旧成在线 | 三年片在线观看免费大全哔哩哔哩 | 无线网在线观看 | 日本免费一区二区视频 | 桃花在线观看视频播放 | 国产精品偷伦费看 | 亚洲国产综合 | 99精产国品一二三产区区 | 偷拍激情视频一区二区三区 | 最近的2025中文| 亚洲aⅴ乱码一区 | 日韩欧洲区精品一区二区 | 国产免费私拍一区二区三区 | 黑人巨大精品欧美一区在线 | 国产98色在线 | 一进一出又大又粗爽视频 | 国产伦精品一区二区三区视 | 国产精品三p一区二区视频 h片在线播放免费 | 最近的中文字幕 | 国产哟一区二区三区视频在线看 | 亚洲一级特黄大片在线播放 | 因为太怕痛就全点防御力了 | 国产精品免 | 国产中文字幕在线观看 | 欧美亚洲国产清纯综合图区 | 亚洲精品成人区在线观看 | 欧美一区二区三区性 | 免费国产人做人视频在线观看 | 精品福利一区二区视频 | 国产精品日产欧美在线一区 | 免费最新热播韩剧美剧电视剧 | 国产激情免费视频在线观看 | 最新版本直播app | 亚洲一区二区在线播放 | 精品国产9 | 在线观看亚洲 | 国产一区鲁鲁在线视频免费播放 | 小姨子在旁边差点被看到 | 最新好剧电影在线观影平台 | 国产高清在线免费观看 | 欧美巨大黑人极品hd | 在线精品国精品国产尤物 | 九九九精品视频在线播放 | 性色xxxxhd天美传媒 | 影音先锋在播 | 欧美日韩在线观看区一二 | 国产午夜理论不卡在线观看 | 好看的网络短 | 91日本在线观看亚洲精品 | 久青草久青草视频在线观看 | 人人爱天天做夜夜爽2025 | 欧美日韩不卡高清在线看 | 欧美激情αv一区二区三区 国语在线看免 | 白丝袜国产淫秽网站 | 成人免费观看黄ā大片夜月 | 观看免费视频 | 日韩精品欧美 | 一级特黄高清aaa | 日韩在线视频www色 午夜福利在线观看亚洲一区二区 | 亚洲欧洲国产韩国va在线 | 最新日韩欧美不卡一二三 | 国产精品精华液网站 | 亚洲精品一区二区三区四区五区 | 高清在线一区 | 男女猛烈xx00免费视频试看 | 字幕在线| 最近中文字幕完整版2025一页 | 久精品视频 | 日本大片免a费观看视频 | а∨天堂在线中 | 国产超级 | 亚洲欧美精品一中文字幕 | 高清欧美日韩一区二区三区在线 | 国产目拍亚洲精品二区 | 国产精品资源网站视频 | 永久精品电影在线观看 | 香蕉五月天一综合网 | 99精品视频在 | 日本黄一级日本黄二级 | 日本三级韩国三级三级a级按 | 灬大ji巴太粗太长了h | 国产精品自在线拍国产下载 | 91福利| 国产全肉乱妇杂乱视频 | 一级一黄免费视频在线看 | 成人一区二区三区 | 热99精品视频 | 色屁屁一区二区三区视频国产 | 理论片在线电影 | 免费在线观看电视剧大全 | 日韩高清码中文字幕日韩 | 色综合色狠狠天天综合 | 奇米影视77 | 成人欧美视频在线观看 | 欧美日韩中文在线视频 | 1905电影网| 国产精品va视频一区二区 | 在线日韩欧美视频一区二区 | 国产巨作在线无遮 | 日本一区二区电影 | 永久在线观看 | 欧美日本一区二区视频在线播放 | 亚洲欧美v视色一区二区 | 日本好屌色不卡视频在线观看 | 欧美不卡视频 | 亚州一级在线播放 | 国产精品亚洲给色区 | 九九九热在线精品免费全部 | 在线成人免费观看国产精品 | 午夜国产福到在线 | 中文字幕不卡高 | 亚洲视频精品 | 国产亚洲精品aa | 麻花天美星空果冻 | 国产视频短 | 欧美日韩在线第一页 | 在线观看视频一区精 | 日韩美女永久网址在线观看 | 国产99这里只有精品 | 亚洲热视频 | 日韩精品视频一区二区三区 | 最污网站 | 中文字幕在线有码高清 | 在线欧美日韩成人 | 久操电影网 | 免费黄频在线免费观看 | 亚洲国产日韩精品 | 亚洲911精品一区二区 | 欧美性猛交xxxx乱大交3 | 成年女人黄小视频 | 日本高清专区一区二无线 | 国产精品免费在线观看 | 国产精品蜜桃 | 57pao视频国产在线观看 | 写真福利理论片在线播放 | 免费人成视频在线看片下载 | 日日摸夜夜添欧美一区 | 欧美制服丝袜在线 | 亚洲欧美中文日韩v在线观看 | 亚洲狠狠ady亚洲精品大秀 | 免费h网站| 五月天在线观看视频网站 | 成人免费观看做爰视频胸大 | 狂野欧美性猛xxxx乱大交 | 日韩精品免费一线在线观看 | 日韩中文字幕视频 | 国产在线精品手机播放 | 欧美性在线观看 | 精品国产人成亚洲区 | 电影网在线好看 | 99人精品福利在线观看 | 国产v亚洲v天堂宗合 | 欧美大成色www永久网站婷 | 欧美制服丝袜国产日韩一区 | 羞羞视频免费网 | 免费进入 | 99视频都是精品热在 | 欧美一级一区二区电影 |