青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

聚星亭

吾笨笨且懶散兮 急須改之而奮進
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

是啊,不可避免的,我們要學習指針了。關于指針的概念,我們已經(jīng)在第一章節(jié) 理解程序中的數(shù)據(jù) 課題中大概的介紹過了,我想它并不是一個很難的概念,如果對指針沒有任何一點概念的朋友可以試著百度一下,再看一下我們以前的章節(jié)。

 

       之所以把指針放到現(xiàn)在來講,一方面是因為,到現(xiàn)在我們所學的知識,可以允許我把一個完整的指針及其相關的知識展現(xiàn)給大家而不需將一個知識點打亂到各個別的章節(jié)中;再一方面就是我們接下來的要學習的繼承、多態(tài)等特性剛好需要這方面的的知識,省的我們再回頭復習,當然,主要原因還是我沒有信心能將這個專題寫好。

 

是的,我們在管理內(nèi)存,管理一些數(shù)據(jù)結(jié)構(gòu)等等,很多情況都要使用指針,我們這個專題,就專門來討論下指針的問題。

 

讓我們再來回顧下,指針的一些概念。

一、     什么是指針(指針與變量)。

很多的教科書上說,指針就是一個保存別的變量地址的一個變量,直白點說,指針就是地址。關于什么是變量、什么是地址、什么是數(shù)據(jù)類型的問題,我想大家應該都明白的,這里我就節(jié)省一些篇幅。

 

好,我們看一下指針的定義格式:

數(shù)據(jù)類型  *指針變量名; // 單純的使用指針變量名就是操作地址,給變量名帶上*就是取內(nèi)容。

               

好,既然指針時用來保存別的變量的地址的,那我們可以很容易的給一個指針變量賦值,以及對一個指針變量進行操作(見代碼:Exp01:

#include "stdafx.h"

#include <stdio.h>

#include <string.h>

 

int main(int argc, char* argv[])

{

    int nNum = 0;

    int *pnNum = NULL;

 

    pnNum = &nNum; // nNum的地址保存到pnNum變量中;

 

    scanf("%d", &nNum); // 輸入一個數(shù)值

 

    printf("nNum變量的地址: 0x%08X\r\n", &nNum);  // 輸出nNum變量的地址

    printf("nNum變量的內(nèi)容: %d\r\n", nNum);       // 輸出輸入的變量的內(nèi)容

    printf("pnNum的地址:  0x%08X\r\n", &pnNum);   // 輸出指針變量pnNum的地址

    printf("pnNum的內(nèi)容:  0x%08X\r\n", pnNum);    // 輸出指針變量pnNum的內(nèi)容

    printf("pnNum內(nèi)容的內(nèi)容: %d\r\n", *pnNum);    // 輸出指針變量pnNum內(nèi)容的內(nèi)容

 

    return 0;

}    

好,貼一下運行結(jié)果,讓我們仔細比較這兩個變量之間的聯(lián)系。

 

看明白了么?是不是可以理解成pnNum指向了nNum變量呢?由此,我們可以說,pnNumnNum的指針。

如果大家真的明白了他們的關系,大家不妨試著寫寫nNum指針的指針的指針……

當然,如果內(nèi)存學的夠好的朋友可以寫一下這兩個變量在棧的排列方式……

二、     指針與數(shù)組

忘記在哪本書中說的: 指針和數(shù)組是近親。現(xiàn)在越來越發(fā)現(xiàn),確實是這個樣子的,下面讓我來帶著大家領略下它們的風采。

1.       數(shù)組的基本用法

       關于數(shù)組,我想大家應該太不陌生了,我們第一節(jié)課就講述了數(shù)組的用法。

       在這里,我們?yōu)榱斯?jié)省篇幅,我僅簡單扼要的回顧一下數(shù)組相關的知識點:

1、  數(shù)組是用來存放相同數(shù)據(jù)類型的數(shù)據(jù)集合

2、  數(shù)組名就是這一數(shù)據(jù)集合的首地址(是常量)。

3、  數(shù)組的下標從0開始,數(shù)組中的數(shù)據(jù)是按照數(shù)組的下標順序依次存放。

 

如下面的程序:

#include <windows.h>

 

int main()

{

    char    szaddrName[] = "52pojie.cn";

    char    *pszTitle   = "Null";

 

       MessageBoxA(NULL, szaddrName , pszTitle, MB_OK);

 

       return 0;

}

 

       OK,我們看下他們的存放方式有什么區(qū)別:

哈哈,是不是一樣呢?

2.       數(shù)組和指針的互操作

char    g_szaddrName[] = "52pojie.cn";

char    *g_pszTitle   = "Null";

 

// 用指針操作數(shù)組

void TestPoint()

{

    char *pszPoint = g_szaddrName;

 

    while (*pszPoint)

    {

        printf("%c", *pszPoint++);

    }

 

    printf("\r\n");

}

 

// 用數(shù)組操作指針

void TestArr()

{

    char *pszPoint = g_szaddrName;

    int nLength = strlen(pszPoint);

 

    for (int i = 0; i < nLength; i++)

    {

        printf("%c", pszPoint[i]);

    }

 

    printf("\r\n");

}

3.       二維數(shù)組的基本用法

OK,明白了這些,我們舉一個簡單走迷宮的例子來說明二維數(shù)組的存儲和使用(具體代碼見Exp03):

我們先定義一個地圖:

/************************************************************************/

// 迷宮地圖數(shù)據(jù)

// 0表示墻

// 1表示可以行走的路

// 2表示已經(jīng)走過的路

// 3表示返回的路

/************************************************************************/

int g_MazeMapData[13][13] = {

    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

    {0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1},

    {0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0},

    {0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0},

    {0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0},

    {0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0},

    {0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0},

    {0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0},

    {0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0},

    {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0},

    {0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0},

    {0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0},

    {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};

有了地圖,我們需要一些標記,用來確定如:入口點坐標,出口在哪里,指定的坐標經(jīng)過沒有等等問題:

#define IN_POS_X    1  // 入口點X坐標

#define IN_POS_Y    12   // 入口點Y坐標

#define OUT_POS_X   12   // 出口點X坐標

#define OUT_POS_Y   1  // 出口點Y坐標

 

#define UNKNOWN     1   // 從來沒走過的路

#define PASS        2   // 經(jīng)過的標記

#define BACK        3   // 返回的標記

 

#define GO          0   // 前進

#define COMEBACK    1   // 后退

 

接下來,我們需要考慮下,實現(xiàn)走路的方式:

/************************************************************************/

// 按照 上、右、下、左的順序?qū)ぢ?/span>

// 參數(shù)含義:

//     nFlag: GO 表示前進,COMEBACK表示返回

// :

//     1 : 向上走,2: 向右走, 3: 向下走, 4: 向左走, 0:異常(出地圖了,不移動)

/************************************************************************/

int MoveTo(int nFlag)

{

    if(nFlag == 0)

    {

        //

        if (g_MazeMapData[g_nCurPosX][g_nCurPosY-1] == UNKNOWN)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = PASS;

            g_nCurPosY--;

            return 1;

        }

 

        //

        if (g_MazeMapData[g_nCurPosX+1][g_nCurPosY] == UNKNOWN)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = PASS;

            g_nCurPosX++;

            return 2;

        }

 

        //

        if (g_MazeMapData[g_nCurPosX][g_nCurPosY+1] == UNKNOWN)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = PASS;

            g_nCurPosY++;

            return 3;

        }

 

        //

        if (g_MazeMapData[g_nCurPosX-1][g_nCurPosY] == UNKNOWN)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = PASS;

            g_nCurPosX--;

            return 4;

        }

    }

    else

    {

        //

        if (g_MazeMapData[g_nCurPosX][g_nCurPosY-1] == PASS)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = BACK;

            g_nCurPosY--;

            return 1;

        }

 

        //

        if (g_MazeMapData[g_nCurPosX+1][g_nCurPosY] == PASS)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = BACK;

            g_nCurPosX++;

            return 2;

        }

 

        //

        if (g_MazeMapData[g_nCurPosX][g_nCurPosY+1] == PASS)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = BACK;

            g_nCurPosY++;

            return 3;

        }

       

        //

        if (g_MazeMapData[g_nCurPosX-1][g_nCurPosY] == PASS)

        {

            g_MazeMapData[g_nCurPosX][g_nCurPosY] = BACK;

            g_nCurPosX--;

            return 4;

        }

    }

 

    return 0;

}

 

最后,我們只需要一個函數(shù),來確定是否到達出口,或者判斷下有沒有出口并給出相應提示:

/************************************************************************/

// 開始走迷宮

// 如果找到出口了,返回1,否則返回0

// 如果程序異常中斷了,返回-1

/************************************************************************/

int Start()

{

    while (1)

    {

        // 開始走路

        if (MoveTo(GO) == 0)

        {

            MoveTo(COMEBACK);

        }

 

        for(int i=0; i<=OUT_POS_X; i++)

        {

            for(int j = 0; j <= IN_POS_Y; j++)

            {

                printf("%d ", g_MazeMapData[i][j]);

            }

            printf("\r\n");

        }

 

            Sleep(500);

        system("cls");

 

        // 如果當前的坐標是出口坐標表示找到出口了

        if (g_nCurPosX == OUT_POS_X && g_nCurPosY == OUT_POS_Y)

        {

            return 1;

        }

 

        // 如果又退回入口位置了,表示沒有找到出口

        if (g_nCurPosX == IN_POS_X && g_nCurPosY == IN_POS_Y)

        {

            return 0;

        }

    }

 

    return -1;

}

 

我相信,通過這個程序,足夠讓大家理解并掌握二維數(shù)組及多維數(shù)組的用法了。下面,我們來考慮一些具體的問題。

4.       數(shù)組的尋址方式

相信好多朋友同我一樣,很抽象的將二維數(shù)組在內(nèi)存中的模樣就想像成二維的平面了,三維數(shù)組就想想成立方體……,卻忽略掉它們其實都是線性存儲的。

 

       這樣,無論是我們在以后的編碼過程中還是在逆向分析中確定當前操作的是哪個元素就尤為重要的。(比如通過單循環(huán)來遍歷一個二維數(shù)組等等)。

 

       其實,如果真要說起它的尋址方式,還真的挺容易的,不信,聽我慢慢道來:

a)      一維數(shù)組的尋址

       比如,已知在自己身前10米處有一柵門,門后面有一排邊長為1米的正方形箱子,求第四個箱子離自己有多遠,哈哈,簡單吧:相信很多朋友脫口就能說出來是:10+1*4  = 14

 

       那再問,一個數(shù)組:int ary[10] = {0}; //已知 ary的地址是:0x12ff68,ary[3]的地址是多少?。

0x12ff68+sizeof(int)*3 = 0x12ff68+0x0C = 0x12ff74

 

b)      二維維數(shù)組的尋址

: 有十個箱子,沒個箱子中放十個蘋果,求第七個箱子中第三個蘋果是這些箱子中的第幾個蘋果。

                    

       這個問題是不是就相當于有A[10][10] A[6][2]是第幾個元素。即:6*10+3 = 63 

       由此推理,我們可以推演一下它的尋址公式:

如:有數(shù)組:type ary[x][y]; ary[x][z]的地址是:

Ary[x]addr = ary addr + sizeof(type[y])*x = ary addr + sizeof(type)*x*y

Ary[x][z]addr = ary[x]addr + sizeof(type)*z

由此,將公式優(yōu)化一下:

Ary[x][z]addr = ary addr + sizeof(type)*y*x + sizeof(type)*z;

            = ary addr + sizeof(type)*(x*y+z);

 

因此,二維數(shù)據(jù)的尋址公式就是:Ary[x][z]addr = ary addr + sizeof(type)*(x*y+z);

此公式中x*y+z就是求第幾個元素的公式。

 

舉個例子實驗一下:

如:int ary[3][4] = {0};已知數(shù)組首地址是:0x12ff68,ary[1][2]是第幾個元素,并求出其在內(nèi)存的地址。

套公式:

11*4+2 = 6 ,所以是第六個元素。

20x12ff68+sizeof(int)*(1*4+2) = 0x12ff68+ 4 * 6 = 0x12ff68 + 0x18 = 0x12ff80,地址是:0x12ff80

 

5.       淺談指針數(shù)組

只簡單說明下用法,詳細信息大家自己摸索,下滿舉個應用的例子,一堆字符串的排序:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

/************************************************************************/

// 按照字符順序排序

/************************************************************************/

int SortTaxis(char *szNameBuf[], int nCount)

{

    int x = 0, y = 0;

    char *szTmpBuf = NULL;

 

    if (szNameBuf == NULL)

    {

        return 0;

    }

 

    if (nCount <= 0)

    {

        return 0;

    }

 

    for (x = 0; x < nCount-1; x++)

    {

        for (y = x+1; y < nCount; y++)

        {

            if (strcmp(szNameBuf[x], szNameBuf[y]) > 0)

            {

                szTmpBuf = szNameBuf[x];

                szNameBuf[x] = szNameBuf[y];

                szNameBuf[y] = szTmpBuf;

            }

        }

    }

   

    return 0;

}

 

int main()

{

    int i = 0;

 

    char *szNameBuf[] = {

    "Kalkwasser",

    "John Parsons",

    "Nathan Bryce",

    "Edward",

    "John Mackintosh",

    "Henry Ford",

    "William Sanders",

    "Nathaniel",

    "George",

    "Tom Rees",

    "Clementia",

    "Mary Jones",

    "Natasha",

    "DrMudd",

    "Charlie Chaplin",

    "Julius Caesar",

    "Krakatoa",

    "James Brady",

    "John Paul II",

    "Freud",

    "Tom Rees",

    "pineapple lily",

    "Antony"};

 

    SortTaxis(szNameBuf, 23);

 

    for (i = 0; i < 23; i++)

    {

        puts(szNameBuf[i]);

    }

     return 0;

}

簡單的評論下,這樣寫的代碼簡單精簡,效率高,因為它交換的是指針,用的是指針數(shù)組,與二維數(shù)組相比,它節(jié)省空間……

三、     指針與函數(shù)

1.       用指針作為函數(shù)的參數(shù)

我想,不論是指針作為參數(shù)還是引用作為參數(shù),都有值得讓我們來調(diào)試它一下,弄清楚其原理,由于這些比較簡單,所以具體的調(diào)試過程留給大家,希望大家也能得到與我一樣的結(jié)論:傳遞的是地址,存在一份地址的拷貝。

 

具體使用指針作為參數(shù)的參考代碼可以見上面指針數(shù)組的函數(shù):

int SortTaxis(char *szNameBuf[], int nCount)

2.       用指針作為函數(shù)的返回類型

返回一個指針類型是可行的,但是我相信初學者一定像我一樣,都會犯一個同樣的錯誤:返回局部變量的地址,如下代碼:

char * stringcat(char *pszStr1, char *pszStr2)

{

    if (!pszStr1 || !pszStr2)

    {

        return NULL;

    }

 

    char pszResultStr[128] = {0};

    strcpy(pszResultStr, pszStr1);

    strcat(pszResultStr, pszStr2);

     return pszResultStr;

}

                     這段代碼漏洞很多,我希望我的讀者朋友不會寫出這樣的代碼。

1、  首先它定義的是數(shù)組,空間大小可能越界造成棧溢出漏洞。

2、  它返回的是一個棧地址,容易被覆蓋。

我希望大家能調(diào)試一下這段代碼(Exp05)就想我以前調(diào)試分析別的代碼一樣,大家自己分析下,問題出在哪里。

3.       使用函數(shù)指針

經(jīng)過上面的一翻學習,我相信,大家已經(jīng)很清楚的明白,我們的指針不僅能夠指向棧數(shù)據(jù)區(qū),而且還可以指向堆數(shù)據(jù)區(qū)乃至全局數(shù)據(jù)區(qū),當然,我相信大家也肯定能夠理解指針也可以指向代碼區(qū),因為我們早在學習函數(shù)的專題中,用數(shù)組存放我們代碼的機器碼并執(zhí)行過它,數(shù)組名不就是數(shù)組的首地址么,函數(shù)名不也是地址么,地址不就是指針么。

 

好,不多廢話,看代碼(Exp06):

int sum(int nNum1, int nNum2)

{

    return nNum1 + nNum2;

}

 

int main()

{

    int nSum = sum(1, 2);

 

    printf("%d\r\n", nSum);

 

    return 0;

}

 

想必,這個是我寫過的最簡單的函數(shù)了,不用加注釋,大家肯定能猜出來這段代碼的含義(如果真的不知道它的功能,那……)。

 

現(xiàn)在我們需要寫一個指針,讓它指向這個函數(shù),應該怎么寫呢?

 

回想一下我們以前說過的話,一個函數(shù)名,就是一個地址,也就是一個int類型的常量,倘若如果我們直接給一個整型指針賦值一個函數(shù)名,編譯器檢查應該是類型報錯,我們先測試一下:

int *pFun = sum; // error C2440: 'initializing' : cannot convert from 'int (__cdecl *)(int,int)' to 'int *'             

很明顯,類型轉(zhuǎn)換出錯了,按照錯誤提示,我們修改一下:

int (__cdecl *pFun)(int,int) = sum; // 哈哈,編譯通過。

 

我們知道,__cdeclC調(diào)用方式(可以省略的.),OK,我們現(xiàn)在測試一下,這個函數(shù)指針能不能用:

int (*pFun)(int,int) = sum;

 

nSum = pFun(3, 8);

printf("%d\r\n", nSum);

                     OK,大功告成。

四、     指針的擴展用法

1.       函數(shù)指針類型的定義

我想,像上面這樣定義一個指針,一定非常的麻煩的,如果我們在牽扯到一些數(shù)據(jù)類型轉(zhuǎn)換,那更是讓人頭疼。比如下面的代碼:

int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);
HMODULE hDll=LoadLibrary("user32.dll");
call=(int(WINAPI * )(HWND,LPSTR,LPSTR,UINT))GetProcAddress(hDll,"MessageBoxA");
FreeLibrary(hDll);
(*call)(NULL,"HI,I AM  FROM USER32.DLL","TEST",MB_OK);

 

當然,這還是簡單的,還有更復雜足以讓我們頭暈的代碼,就不以此列舉了。這就迫使我們定義一個相關的數(shù)據(jù)類型,這樣以后只要像定義一個變量那樣使用就可以了,比如上面的代碼可以變成:

typedef int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);
call mycall;      //
定義一個函數(shù)指針變量
HMODULE hDll=LoadLibrary("user32.dll");

mycall=(call)GetProcAddress(hDll,"MessageBoxA");
FreeLibrary(hDll);
(*mycall)(NULL,"HI,I AM  FROM USER32.DLL","TEST",MB_OK);

這樣就讓人好理解,同樣也精簡了代碼。

 

我相信,對于typedef這個關鍵字,我們一定不陌生,因為在本系列的第一小節(jié)中,我們已經(jīng)提到過它了。它的基本用法格式是: typedef 舊數(shù)據(jù)類型 新數(shù)據(jù)類型

 

通過上面的編譯錯誤:'int (__cdecl *)(int,int)' to 'int *' 我們可以知道,int (__cdecl *)(int,int)本來就是數(shù)據(jù)類型。而 int (__cdecl *PFUN_TYPE)(int,int) 中的PFUN_TYPE就是新的數(shù)據(jù)類型。

 

這樣,我們最開始的代碼就又可以寫成:

    typedef int (*PFUN_TYPE)(int,int);

    PFUN_TYPE pFun;

 

    pFun = sum;

    int nSum = pFun(3, 8);

    printf("%d\r\n", nSum);

2.       成員函數(shù)指針的使用

從進入C++的課程以來,我們講述了類中成員函數(shù)的調(diào)用方式,它們比起普通的函數(shù)多了一個傳遞this指針的過程,因此,我們剛才說的定義函數(shù)指針的方法對于成員函數(shù)而言是無效的。其解決方法也自然的就變成了怎么傳遞一個this指針呢?

 

回想一下,我們在類外定義成員函數(shù)的代碼,比如:

bool CExample::SetNum(int nFirst, int nSec)

{

    m_nFirstNum  =  nFirst; 

    m_nSecNum  =  nSec ;

    return true;

}

對,它限定了作用域,所以它表示它仍然是類內(nèi)的一個函數(shù),那我們的函數(shù)指針也仿造它來寫一個。

typedef void (Person::*PBASEFUN_TYPE)();  // 這里的*是為了與靜態(tài)成員函數(shù)區(qū)分

                好,我們編寫如下代碼(見Exp06):

class Person;

typedef void (*PFUN_TYPE)();

typedef void (Person::*PBASEFUN_TYPE)();

 

class Person

{

public:

    PBASEFUN_TYPE *m_pFunPoint;

    Person()

    {

           m_pFunPoint = (PBASEFUN_TYPE*)new PFUN_TYPE[2];

           m_pFunPoint[0] = (PBASEFUN_TYPE)sayHello;

           m_pFunPoint[1] = (PBASEFUN_TYPE)sayGoodbye;

    }

 

    void sayHello()

    {

           printf("person::Hello\r\n");

    }

 

    void sayGoodbye()

    {

           printf("person::Goodbye\r\n");

    }

};

這樣,我們就簡單的實現(xiàn)了一個成員函數(shù)的指針數(shù)組,算是為我們學習類的多態(tài)性中虛函數(shù)大點兒基礎,相信大家應該能看明白吧。

調(diào)用測試一下:

    Person thePer;

    (thePer.*thePer.m_pFunPoint[0])();

五、     幾點注意事項

1、  一定要注意函數(shù)指針指向內(nèi)容的釋放以免防止內(nèi)存泄露。

2、  注意及時將不用的指針賦值為NULL,以避免野指針的問題。

六、     小結(jié)

指針為我們的編程提供了諸多的技巧,簡化了我們的代碼。當然,于此同時,它也有反面的作用:當今軟件中的內(nèi)存錯誤及不穩(wěn)定,90%以上是由于指針操作失誤而導致的,這足以見得指針的破壞力。

 因此,有效、合理、安全的使用指針是每個C程序員必備的基本素質(zhì)。

Feedback

# re: 笨鳥先飛學編程系列之 指針  回復  更多評論   

2010-03-24 13:45 by besterChen
@羅萊家紡官方網(wǎng)站
(⊙o⊙)…

# Xf6F2q , [url=http://okppdtrywaxj.com/]okppdtrywaxj[/url], [link=http://oagnutcxwefb.com/]oagnutcxwefb[/link], http://mxsesllsxojj.com/  回復  更多評論   

2011-05-27 01:10 by cegjjn
Xf6F2q , [url=http://okppdtrywaxj.com/]okppdtrywaxj[/url], [link=http://oagnutcxwefb.com/]oagnutcxwefb[/link], http://mxsesllsxojj.com/

# re: 笨鳥先飛學編程系列之 指針  回復  更多評論   

2011-11-06 15:42 by HuKer
看來你的指針學的很潛啊。

# re: 笨鳥先飛學編程系列之 指針  回復  更多評論   

2012-01-10 12:54 by 小菜貓
太高深了。。。 學習。。。。。。。。。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区欧美成人| 欧美1区2区3区| 久久久久久9| 国产亚洲人成a一在线v站| 久久成人在线| 一区二区欧美视频| 影音先锋中文字幕一区| 亚洲欧洲视频在线| 国产伦精品一区二区三区免费迷| 国产精品美女999| 国产精品午夜在线观看| 国产自产v一区二区三区c| 国产欧美日韩不卡| 在线精品国产欧美| 99精品福利视频| 小处雏高清一区二区三区| 久久久一区二区| 亚洲国产日韩一区| 亚洲视频在线看| 久久久久国产精品一区| 欧美激情综合在线| 国产亚洲午夜| 99视频热这里只有精品免费| 欧美专区亚洲专区| 亚洲精品国产精品国自产观看浪潮| 宅男66日本亚洲欧美视频| 久久精品综合| 欧美午夜不卡视频| 在线成人性视频| 亚洲愉拍自拍另类高清精品| 免费亚洲一区| 亚洲欧美日韩精品在线| 欧美激情国产日韩| 精品盗摄一区二区三区| 亚洲欧美日韩国产另类专区| 欧美激情精品久久久久久久变态| 亚洲深夜激情| 欧美精品九九99久久| 极品少妇一区二区三区| 欧美一区二区精品| 99riav国产精品| 免费亚洲网站| 国产一在线精品一区在线观看| 一区二区三区四区国产精品| 欧美肥婆在线| 久久九九精品| 国产三级精品三级| 午夜在线精品| 一区二区久久久久久| 欧美经典一区二区三区| 亚洲欧洲日产国码二区| 美腿丝袜亚洲色图| 久久国产福利| 国产一区二区三区电影在线观看| 亚洲欧美一区二区三区极速播放 | 欧美日韩在线播放三区| 欧美一级理论片| 亚洲激情在线观看| 久久亚洲免费| 激情综合久久| 毛片一区二区| 久久成人在线| 国产一区深夜福利| 欧美中日韩免费视频| 亚洲一区二区日本| 国产九九精品| 久久精品亚洲| 久久精品天堂| 亚洲高清影视| 亚洲韩国一区二区三区| 欧美国产日韩一区二区在线观看| 亚洲精品欧美极品| 亚洲精品一区二区三区蜜桃久| 欧美精品入口| 亚洲视频在线一区| 宅男在线国产精品| 国产精品视频免费| 久久人体大胆视频| 欧美成人久久| 中文欧美在线视频| 亚洲欧美日韩成人| 黑人一区二区| 亚洲国产高清自拍| 国产精品国产三级国产aⅴ9色| 午夜伦欧美伦电影理论片| 欧美在线www| 亚洲日本aⅴ片在线观看香蕉| 99国产精品| 国产一区二区三区久久 | 欧美一区二区三区视频| 久久久国产精品亚洲一区| 亚洲国产欧美久久| 亚洲色图制服丝袜| 亚洲国产成人在线播放| 亚洲免费av网站| 国产欧美日韩精品在线| 欧美福利电影网| 国产精品日韩欧美综合| 欧美电影免费观看大全| 国产精品a级| 免费人成精品欧美精品| 欧美日韩一区免费| 久久综合婷婷| 国产精品久久久久久久久动漫| 久久伊伊香蕉| 欧美视频一区二区| 男人的天堂亚洲在线| 国产精品免费一区二区三区观看| 欧美高清一区二区| 国产一区二区三区自拍| 99精品国产福利在线观看免费| 激情丁香综合| 亚洲一区二区三区精品动漫| 欧美日本韩国| 国产欧美一区二区三区久久 | 久久久精品一区二区三区| 欧美精品久久99| 久久色中文字幕| 国产精品亚洲成人| 夜夜爽www精品| 亚洲国产成人精品女人久久久| 亚洲午夜影视影院在线观看| 亚洲老司机av| 欧美一级日韩一级| 午夜日本精品| 国产精品久久婷婷六月丁香| 欧美专区福利在线| 国产精品视频不卡| 99精品欧美一区二区三区| 亚洲欧洲一区| 久久亚裔精品欧美| 久久久久.com| 国产亚洲女人久久久久毛片| 一区二区免费在线视频| 一区二区三区不卡视频在线观看 | 免费视频亚洲| 伊人久久亚洲影院| 久久国内精品自在自线400部| 欧美在线视频免费| 国产欧美日韩一区| 性久久久久久久| 久久久久久久999精品视频| 国产三级欧美三级| 久久精品国产在热久久 | 夜夜爽99久久国产综合精品女不卡| 鲁大师成人一区二区三区| 裸体歌舞表演一区二区| 亚洲国产欧洲综合997久久| 久久嫩草精品久久久精品一| 欧美高清不卡| 亚洲精品视频在线播放| 欧美激情国产高清| 中文精品一区二区三区| 久久精品一区四区| 亚洲黄色精品| 国产精品扒开腿爽爽爽视频| 亚洲一级特黄| 老司机午夜精品视频在线观看| 亚洲激情国产精品| 国产精品theporn88| 欧美一区日韩一区| 欧美国产视频一区二区| 在线视频精品| 国产一级久久| 欧美精品日日鲁夜夜添| 午夜精品久久久久久久久久久| 久久精品国产一区二区电影 | 巨胸喷奶水www久久久免费动漫| 亚洲综合国产| 欧美激情免费在线| 亚洲最新在线| 国产精品亚洲一区二区三区在线| 亚洲欧美综合网| 欧美本精品男人aⅴ天堂| 一区二区久久久久| 红桃视频欧美| 欧美日本精品在线| 欧美一区午夜精品| 日韩视频免费观看高清在线视频| 久久激情综合| 99香蕉国产精品偷在线观看| 国产亚洲aⅴaaaaaa毛片| 欧美男人的天堂| 久久精品中文字幕一区| 亚洲午夜一级| 亚洲黄色在线看| 久久久精品国产免大香伊| 一本在线高清不卡dvd| 狠狠久久亚洲欧美| 国产精品美女一区二区| 欧美久久久久久蜜桃| 久久久高清一区二区三区| 亚洲天堂激情| 亚洲国产毛片完整版| 欧美一级片在线播放| 日韩网站在线| 亚洲国产成人91精品| 欧美亚州在线观看| 欧美另类专区| 欧美国产精品人人做人人爱|