久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区


曙海教育集團(tuán)論壇開發(fā)語言培訓(xùn)專區(qū)VB語言 → VB真是想不到系列之二:VB《葵花寶典》--指針技


  共有8222人關(guān)注過本帖樹形打印

主題:VB真是想不到系列之二:VB《葵花寶典》--指針技

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個(gè)性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
VB真是想不到系列之二:VB《葵花寶典》--指針技  發(fā)帖心情 Post By:2010-12-14 12:35:56

《VB真是想不到系列》
    每次看大師的東西到了精彩之處,我就會拍案叫絕:"哇噻,真是想不到!"。在經(jīng)過很多次這種感慨之后,我發(fā)現(xiàn)只要我們動了腦筋,我們自己也能有讓別人想不到的東西。于是想到要把這些想不到的東拿出來和大家一起分享,希望拋磚引玉,能引出更多讓人想不到的東西。
   
                  VB真是想不到系列之二:VB《葵花寶典》--指針技術(shù)
關(guān)鍵字:VB、指針、動態(tài)內(nèi)存分配、效率、安全
難度:中級至高級
要求:熟悉VB,掌握基本的C,了解匯編,了解內(nèi)存分配原理。
    想當(dāng)年東方不敗,黑木崖密室一戰(zhàn),僅憑一根繡花針獨(dú)戰(zhàn)四大高手,神出鬼沒,堪稱天下武林第一高手。若想成為VB里的東方不敗,熟習(xí)VB《葵花寶典》,掌握VB指針技術(shù),乃是不二的法門。
    欲練神功,引刀……,其實(shí)掌握VB指針技術(shù),并不需要那么痛苦。因?yàn)檎f穿了,也就那么幾招,再勤加練習(xí),終可至神出鬼沒之境。廢話少說,讓我們先從指針的定義說起。
   
    一、指針是什么?
    不需要去找什么標(biāo)準(zhǔn)的定義,它就是一個(gè)32位整數(shù),在C語言和在VB里都可以用Long類型來表示。在32位Windows平臺下它和普通的32位長整型數(shù)沒有什么不同,只不過它的值是一個(gè)內(nèi)存地址,正是因?yàn)檫@個(gè)整數(shù)象針一樣指向一個(gè)內(nèi)存地址,所以就有了指針的概念。
    有統(tǒng)計(jì)表明,很大一部分程序缺陷和內(nèi)存的錯誤訪問有關(guān)。正是因?yàn)橹羔樦苯雍蛢?nèi)存打交道,所以指針一直以來被看成一個(gè)危險(xiǎn)的東西。以至于不少語言,如著名的JAVA,都不提供對指針操作的支持,所有的內(nèi)存訪問方面的處理都由編譯器來完成。而象C和C++,指針的使用則是基本功,指針給了程序員極大的自由去隨心所欲地處理內(nèi)存訪問,很多非常巧妙的東西都要依靠指針技術(shù)來完成。
    關(guān)于一門高級的程序設(shè)計(jì)語言是不是應(yīng)該取消指針操作,關(guān)于沒有指針操作算不算一門語言的優(yōu)點(diǎn),我在這里不討論,因?yàn)榛ヂ?lián)網(wǎng)上關(guān)于這方面的沒有結(jié)果的討論,已經(jīng)造成了占用幾個(gè)GB的資源。無論最終你是不是要下定決心修習(xí)指針技術(shù)《葵花寶典》,了解這門功夫總是有益處的。
    注意:在VB里,官方是不鼓勵使用什么指針的,本文所講的任何東西你都別指望取得官方的技術(shù)支持,一切都要靠我們自己的努力,一切都更刺激!
    讓我們開始神奇的VB指針探險(xiǎn)吧!

 

   順便提一下,聽說VB.NET里沒有這幾個(gè)函數(shù),但只要還能調(diào)用API,我們就可以試試上面的幾個(gè)聲明,這樣在VB.NET里我們一樣可以進(jìn)行指針操作。
    但是請注意,如果通過API調(diào)用來使用VarPtr,整個(gè)程序二SwapPtr將比原來使用內(nèi)置VarPtr函數(shù)時(shí)慢6倍。)
    如果你喜歡刨根問底,那么下面就是VarPtr函數(shù)在C和匯編語言里的樣子:
    在C里樣子是這樣的:
    long VarPtr(void* pv){
        return (long)pv;
    }
    所對就的匯編代碼就兩行:
    mov         eax,dword ptr [esp+4]
    ret         4           '彈出棧里參數(shù)的值并返回。
    之所以讓大家了解VarPtr的具體實(shí)現(xiàn),是想告訴大家它的開銷并不大,因?yàn)樗鼈儾贿^兩條指令,即使加上參數(shù)賦值、壓棧和調(diào)用指令,整個(gè)獲取指針的過程也就六條指令。當(dāng)然,同樣的功能在C語言里,由于語言的直接支持,僅需要一條指令即可。但在VB里,它已經(jīng)算是最快的函數(shù)了,所以我們完全不用擔(dān)心使用VarPtr會讓我們失去效率!速度是使用指針技術(shù)的根本要求。
    一句話,VarPtr返回的是變量所在處的內(nèi)存地址,也可以說返回了指向變量內(nèi)存位置的指針,它是我們在VB里處理指針最重要的武器之一。

3、ByVal和ByRef
    ByVal傳遞的參數(shù)值,而ByRef傳遞的參數(shù)的地址。在這里,我們不用去區(qū)別傳指針/傳地址/傳引用的不同,在VB里,它們根本就是一個(gè)東西的三種不同說法,即使VB的文檔里也有地方在混用這些術(shù)語(但在C++里的確要區(qū)分指針和引用)
    初次接觸上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory調(diào)用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)
    準(zhǔn)確的理解傳值和傳地址(指針)的區(qū)別,是在VB里正確使用指針的基礎(chǔ)。
    現(xiàn)在一個(gè)最簡單的實(shí)驗(yàn)來看這個(gè)問題,如下面的程序三:
【程序三】:'體會ByVal和ByRef
    Sub TestCopyMemory()
        Dim k As Long
        k = 5
Note:   CopyMemory ByVal VarPtr(k), 40000, 4
        Debug.Print k
    End Sub
    上面標(biāo)號Note處的語句的目的,是將k賦值為40000,等同于語句k=40000,你可以在"立即"窗口試驗(yàn)一下,會發(fā)現(xiàn)k的值的確成了40000。
    實(shí)際上上面這個(gè)語句,翻譯成白話,就是從保存常數(shù)40000的臨時(shí)變量處拷貝4個(gè)字節(jié)到變量k所在的內(nèi)存中。
    現(xiàn)在我們來改變一個(gè)Note處的語句,若改成下面的語句:
Note2:   CopyMemory ByVal VarPtr(k), ByVal 40000, 4
    這句話的意思就成了,從地址40000拷貝4個(gè)字節(jié)到變量k所在的內(nèi)存中。由于地址40000所在的內(nèi)存我們無權(quán)訪問,操作系統(tǒng)會給我們一個(gè)Access Violation內(nèi)存越權(quán)訪問錯誤,告訴我們"試圖讀取位置0x00009c40處內(nèi)存時(shí)出錯,該內(nèi)存不能為'Read'"。
    我們再改成如下的語句看看。
Note3:   CopyMemory VarPtr(k), 40000, 4
    這句話的意思就成了,從保存常數(shù)40000的臨時(shí)變量處拷貝4個(gè)字節(jié)到到保存變量k所在內(nèi)存地址值的臨時(shí)變量處。這不會出出內(nèi)存越權(quán)訪問錯誤,但k的值并沒有變。
    我們可以把程序改改以更清楚的休現(xiàn)這種區(qū)別,如下面的程序四:
【程序四】:'看看我們的東西被拷貝到哪兒去了
    Sub TestCopyMemory()
        Dim i As Long, k As Long
        k = 5
        i = VarPtr(k)
NOTE4:  CopyMemory i, 40000, 4
        Debug.Print k
        Debug.Print i
        i = VarPtr(k)
NOTE5:  CopyMemory ByVal i, 40000, 4
        Debug.Print k
    End Sub

程序輸出:
5
40000
40000
    由于NOTE4處使用缺省的ByVal,傳遞的是i的地址(也就是指向i的指針),所以常量40000拷貝到了變量i里,因此i的值成了40000,而k的值卻沒有變化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做為一個(gè)指針來使用。這時(shí),我們必須如NOTE5那樣用ByVal來傳遞指針i,由于i是指向變量k的指針,所以最后常量40000被拷貝了變量k里。
    希望你已經(jīng)理解了這種區(qū)別,在后面問題的討論中,我還會再談到它。

4、AddressOf
    它用來得到一個(gè)指向VB函數(shù)入口地址的指針,不過這個(gè)指針只能傳遞給API使用,以使得API能回調(diào)VB函數(shù)。
    本文不準(zhǔn)備詳細(xì)討論函數(shù)指針,關(guān)于它的使用請參考VB文檔。

5、拿來主義。
    實(shí)際上,有了CopyMemory,VarPtr,AddressOf這三把斧頭,我們已經(jīng)可以將C里基本的指針操作拿過來了。
    如下面的C程序包括了大部分基本的指針指針操作:
    struct POINT{
        int x; int y;
    };
    int Compare(void* elem1, void* elem2){}
    void PtrDemo(){
    //指針聲明:
        char c = 'X';        //聲明一個(gè)char型變量
        char* pc; long* pl;  //聲明普通指針
        POINT* pPt;          //聲明結(jié)構(gòu)指針
        void* pv;            //聲明無類型指針
        int (*pfnCastToInt)(void *, void*);//聲明函數(shù)指針:
    //指針賦值:
       pc = &c;              //將變量c的地址值賦給指針pc
       pfnCompare = Compare; //函數(shù)指針賦值。
    //指針取值:
       c = *pc;              //將指針pc所指處的內(nèi)存值賦給變量c
    //用指針賦值:
       *pc = 'Y'             //將'Y'賦給指針pc所指內(nèi)存變量里。
    //指針移動:
       pc++; pl--;
    }

    這些對指針操作在VB里都有等同的東西,
    前面討論ByVal和ByRef時(shí)曾說過傳指針和傳地址是一回事,實(shí)際上當(dāng)我們在VB里用缺省的ByRef聲明函數(shù)參數(shù)時(shí),我們已經(jīng)就聲明了指針。
    如一個(gè)C聲明的函數(shù):long Func(char* pc)
    其對應(yīng)的VB聲明是:Function Func(pc As Byte) As Long
    這時(shí)參數(shù)pc使用缺省的ByRef傳地址方式來傳遞,這和C里用指針來傳遞參數(shù)是一樣。
    那么怎么才能象C里那樣明確地聲明一個(gè)指針呢?
    很簡單,如前所說,用一個(gè)32位長整數(shù)來表達(dá)指針就行。在VB里就是用Long型來明確地聲明指針,我們不用區(qū)分是普通指針、無類型指針還是函數(shù)指針,通通都可用Long來聲明。而給一個(gè)指針賦值,就是賦給它用VarPar得到的另一個(gè)變量的地址。具體見程序五。
【程序五】:同C一樣,各種指針。
    Type POINT
        X As Integer
        Y As Integer
    End Type
    Public Function Compare(elem1 As Long, elem2 As Long) As Long
    '
    End Function
    Function FnPtrToLong(ByVal lngFnPtr As Long) As Long
        FnPtrToLong = lngFnPtr
    End Function
    Sub PtrDemo()
       Dim l As Long, c As Byte, ca() As Byte, Pt As POINT
       Dim pl As Long, pc As Long, pv As Long, pPt As Long, pfnCompare As Long
       c = AscB("X")
       pl = VarPtr(l)     '對應(yīng)C里的long、int型指針
       pc = VarPtr(c)     '對應(yīng)char、short型指針
       pPt = VarPtr(Pt)   '結(jié)構(gòu)指針
       pv = VarPtr(ca(0)) '字節(jié)數(shù)組指針,可對應(yīng)任何類型,也就是void*
       pfnCompare = FnPtrToLong(AddressOf Compare) '函數(shù)指針
       CopyMemory c, ByVal pc, LenB(c)   '用指針取值
       CopyMemory ByVal pc, AscB("Y"), LenB(c) '用指針賦值
       pc = pc + LenB(c) : pl = pl - LenB(l)   '指針移動
    End Sub
    我們看到,由于VB不直接支持指針操作,在VB里用指針取值和用指針賦值都必須用CopyMemory這個(gè)API,而調(diào)用API的代價(jià)是比較高的,這就決定了我們在VB里使用指針不能象在C里那樣自由和頻繁,我們必須要考慮指針操作的代價(jià),在后面的"指針應(yīng)用"我們會再變談這個(gè)問題。
    程序五中關(guān)于函數(shù)指針的問題請參考VB文檔,無類型指針void*會在下面"關(guān)于Any的問題"里說。
    程序五基本上已經(jīng)包括了我們能在VB里進(jìn)行的所有指針操作,僅此而已。

    下面有一個(gè)小測試題,如果現(xiàn)在你就弄懂了上面程咬金的三板斧,你就應(yīng)該能做得出來。
    上面提到過,VB.NET中沒有VarPtr,我們可以用聲明API的方式來引入MSVBVM60.DLL中的VarPtr,F(xiàn)在的問題如果不用VB的運(yùn)行時(shí)DLL文件,你能不能自己實(shí)現(xiàn)一個(gè)ObjPtr。答案在下一節(jié)后給出。

    四、指針使用中應(yīng)注意的問題
    1、關(guān)于ANY的問題
    如果以一個(gè)老師的身份來說話,我會說:最好永遠(yuǎn)也不要用Any!是的,我沒說錯,是永遠(yuǎn)!所以我沒有把它放在程咬金的三板斧里。當(dāng)然,這個(gè)問題和是不是應(yīng)該使用指針這個(gè)問題一樣會引發(fā)一場沒有結(jié)果的討論,我告訴你的只是一個(gè)觀點(diǎn),因?yàn)橛袝r(shí)我們會為了效率上的一點(diǎn)點(diǎn)提高或想偷一點(diǎn)點(diǎn)懶而去用Any,但這樣做需要要承擔(dān)風(fēng)險(xiǎn)。
    Any不是一個(gè)真正的類型,它只是告訴VB編譯器放棄對參數(shù)類型的檢查,這樣,理論上,我們可以將任何類型傳遞給API。
    Any在什么地方用呢?讓我們來看看,在VB文檔里的是怎么說的,現(xiàn)在就請打開MSDN(Visual Studio 6自帶的版本),翻到"Visual Basic文檔"->"使用Visual Basic"->"部件工具指南"->"訪問DLL和Windows API"部分,再看看"將 C 語言聲明轉(zhuǎn)換為 Visual Basic 聲明"這一節(jié)。文檔里告訴我們,只有C的聲明為LPVOID和NULL時(shí),我們才用Any。實(shí)際上如果你愿意承擔(dān)風(fēng)險(xiǎn),所有的類型你都可以用Any。當(dāng)然,也可以如我所說,永遠(yuǎn)不要用Any。   
    為什么要這樣?那為什么VB官方還要提供Any?是信我的,還是信VB官方的?有什么道理不用Any?
    如前面所說,VB官方不鼓勵我們使用指針。因?yàn)閂B所標(biāo)榜的優(yōu)點(diǎn)之一,就是沒有危險(xiǎn)的指針操作,所以的內(nèi)存訪問都是受VB運(yùn)行時(shí)庫控制的。在這一點(diǎn)上,JAVA語言也有著同樣的標(biāo)榜。但是,同JAVA一樣,VB要避免使用指針而得到更高的安全性,就必須要克服沒有指針而帶來的問題。VB已經(jīng)盡最大的努力來使我們遠(yuǎn)離指針的同時(shí)擁有強(qiáng)類型檢查帶來的安全性。但是操作系統(tǒng)是C寫的,里面到處都需要指針,有些指針是沒有類型的,就是C程序員常說的可怕的void*無類型指針。它沒有類型,因此它可以表示所有類型。如CopyMemory所對應(yīng)的是C語言的memcpy,它的聲明如下:
    void *memcpy( void *dest, const void *src, size_t count );
    因memcpy前兩個(gè)參數(shù)用的是void*,因此任何類型的參數(shù)都可以傳遞給他。
    一個(gè)用C的程序員,應(yīng)該知道在C函數(shù)庫里這樣的void*并不少見,也應(yīng)該知道它有多危險(xiǎn)。無論傳遞什么類型的變量指針給上面memcpy的void*,C編譯器都不會報(bào)錯或給任何警告。
    在VB里大多數(shù)時(shí)候,我們使用Any就是為了使用void*,和在C里一樣,VB也不對Any進(jìn)行類型檢查,我們也可以傳遞任何類型給Any,VB編譯器也都不會報(bào)錯或給任何警告。
    但程序運(yùn)行時(shí)會不會出錯,就要看使用它時(shí)是不是小心了。正因?yàn)樵贑里很多錯誤是和void*相關(guān)的,所以,C++鼓勵我們使用satic_cast<void*>來明確指出這種不安全的類型的轉(zhuǎn)換,已利于發(fā)現(xiàn)錯誤。
    說了這么多C/C++,其實(shí)我是想告訴所有VB的程序員,在使用Any時(shí),我們必須和C/C++程序員使用void*一樣要高度小心。
    VB里沒有satic_cast這種東西,但我們可以在傳遞指針時(shí)明確的使用long類型,并且用VarPtr來取得參數(shù)的指針,這樣至少已經(jīng)明確地指出我們在使用危險(xiǎn)的指針。如程序二經(jīng)過這樣的處理就成了下面的程序:
【程序五】:'使用更安全的CopyMemory,明確的使用指針!
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Sub SwapStrPtr2(sA As String, sB As String)
        Dim lTmp As Long
        Dim pTmp As Long, psA As Long, psB As Long
        pTmp = VarPtr(lTmp): psA = VarPtr(sA): psB = VarPtr(sB)
        CopyMemory pTmp, psA, 4
        CopyMemory psA, psB, 4
        CopyMemory psB, pTmp, 4
    End Sub
   


支持(0中立(0反對(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

VB真是想不到系列之二:VB《葵花寶典》--指針技








簽名
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
欧美资源一区| 国产精品一区二区三区免费| 亚洲激情六月丁香| 一二三区精品福利视频| 天堂蜜桃一区二区三区| 美女性感视频久久| 国产99精品国产| 国产日韩亚洲精品| 亚洲 日韩 国产第一区| 欧美精品在线一区二区| 精品国产3级a| 一区二区三区四区亚洲| 麻豆精品在线播放| 7777精品伊久久久大香线蕉语言 | 国产1区2区3区精品美女| 91在线视频在线| 色爱区成人综合网| 欧美精品一卡二卡| 国产精品久久久久婷婷 | 99国产在线观看| 亚洲精品国产精品国自产| 欧美日韩国产一级| 亚洲欧洲无码一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 从欧美一区二区三区| 麻豆成人在线播放| 7777精品久久久大香线蕉| 国产精品久久久久久亚洲毛片 | 亚洲欧美日韩成人高清在线一区| 免费av成人在线| 国产精品乱码视频| 欧美日韩久久久一区| 亚洲欧美综合色| 国产aⅴ精品一区二区三区色成熟| 黑人中文字幕一区二区三区| 欧美午夜一区二区三区| 亚洲欧洲日韩在线| 国产91对白在线观看九色| 日本一区精品| 久久九九99视频| 精品一区二区精品| 欧美一进一出视频| 精品成人佐山爱一区二区| 日韩和欧美的一区| 精品一区日韩成人| 久久女同互慰一区二区三区| 蜜桃视频第一区免费观看| 国产一区在线观| 精品福利在线导航| 国模大尺度一区二区三区| 日韩欧美三级电影| 国产精品少妇自拍| 成人午夜视频在线| 在线视频亚洲一区| 亚洲欧美日韩国产综合| 99精品视频在线观看| 欧美日韩一级片在线观看| 一区二区三区欧美久久| 国产精品加勒比| 精品国产髙清在线看国产毛片| 毛片av一区二区| 亚洲欧洲在线一区| 亚洲乱码日产精品bd| av一区二区三区免费| 精品久久久久99| 国产精品66部| 欧美日韩久久久| 久久精品国产免费| 亚洲欧美日韩精品在线| 亚洲欧美激情小说另类| 97se在线视频| 久久久不卡网国产精品一区| 国产成人午夜精品影院观看视频| 在线看国产日韩| 日韩在线卡一卡二| 亚洲一区二区三区四区中文| 一区二区视频在线看| 鲁片一区二区三区| 亚洲欧美日韩成人高清在线一区| 国产成人免费观看| 日本一区二区三区久久久久久久久不| 成人午夜视频福利| 日韩精品一区二区三区视频 | 亚洲三区视频| 午夜电影网一区| 中日韩在线视频| 青娱乐精品视频| 在线观看成人av电影| 午夜久久电影网| 日本精品视频一区二区三区| 日日夜夜免费精品| 在线中文字幕一区二区| 美日韩一级片在线观看| 欧美性xxxxxxxx| 国产精品性做久久久久久| 欧美一区二区三区视频在线观看| 国产.欧美.日韩| 久久网这里都是精品| 成人自拍视频网站| 成人欧美一区二区三区视频网页| 精品国产一区二区三区免费| 18欧美乱大交hd1984| 日本a级片久久久| 日本欧美在线观看| 制服丝袜在线91| 91玉足脚交白嫩脚丫在线播放| 国产欧美日韩久久| 久久久久网址| 蜜桃传媒麻豆第一区在线观看| 欧美日韩不卡视频| 99久久99久久久精品齐齐| 亚洲国产精品t66y| 日韩av免费电影| 九色|91porny| 日韩欧美国产午夜精品| 91香蕉视频在线下载| 一区二区三区欧美日| 欧美色图片你懂的| 91传媒视频在线观看| 一区二区三区欧美日| 欧美日韩视频在线第一区 | 亚洲曰韩产成在线| 91精品1区2区| www.日本不卡| 亚洲精品国产第一综合99久久 | 国产精品卡一卡二| 中文字幕成人一区| 不卡在线观看av| 亚洲一区在线观看网站| 777色狠狠一区二区三区| 91视频在线免费观看| 视频一区在线视频| 26uuu亚洲婷婷狠狠天堂| 日本一区高清在线视频| 国产精品77777竹菊影视小说| 欧美国产激情一区二区三区蜜月| 色综合久久av| 99久久精品国产网站| 一区二区三区在线观看欧美| 欧美日韩免费视频| 国产一区二区三区高清视频| 久久精品久久久精品美女| 中文字幕不卡在线播放| 欧美影院一区二区| 国产一区二区在线网站| 国产原创一区二区| 亚洲男人的天堂在线aⅴ视频| 欧美日韩1234| 久久伊人资源站| 国产91精品免费| 午夜av一区二区三区| 国产婷婷色一区二区三区四区| 色女孩综合影院| 精品亚洲欧美日韩| 国产传媒欧美日韩成人| 亚洲午夜精品在线| 久久色在线观看| 欧美日本一区二区三区四区 | 日韩欧美在线不卡| 亚洲午夜久久久影院伊人| 91网站在线播放| 国产在线不卡视频| 亚洲成av人影院| 中文字幕在线观看不卡| 日韩亚洲欧美中文三级| 色呦呦一区二区三区| 精品午夜一区二区三区| 不卡在线观看av| 久久99精品久久久久| 亚洲电影一区二区| 国产精品麻豆一区二区| 欧美成人精品福利| 欧美天堂一区二区三区| 亚洲电影免费| 久久精品一区二区三区不卡免费视频| 国产91丝袜在线播放九色| 视频一区二区中文字幕| 亚洲另类春色国产| 国产精品少妇自拍| 久久久噜噜噜久久人人看| 日韩午夜在线影院| 8v天堂国产在线一区二区| 欧美在线999| 国产欧美日本一区视频| 欧美一区二区三区免费大片 | 91精品国产91久久久久久一区二区| 亚洲国产欧美不卡在线观看| 精品一区二区视频| 国产精品日韩欧美一区二区| 99久久精品免费观看| 国产91精品久久久久久久网曝门| 精品一区二区在线看| 免费的成人av| 蜜桃久久精品一区二区| 日本中文字幕一区| 日本中文在线一区| 免费成人av在线| 久久99精品久久久久久| 狠狠久久亚洲欧美| 极品少妇xxxx精品少妇偷拍|