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

指針問題
信息來源:網絡


譯者序:

  這是一篇我所見過的關于指針的最好的入門級文章,它可使初學者在很短的時間內掌握復雜的指針操作。雖然,現在的JAVA、C#等語言已經取消了指針,但作為一個C++程序員,指針的直接操作內存,在數據操作方面有著速度快,節約內存等優點,仍是很多C++程序員的最愛。指針就像是一把良劍,就看你怎么去應用它!
  有關這篇文章的技術性問題你可以寫信給我:webmaster@chinahai.com.同時我的另外兩篇相關文章《模板Guide》和《STL Guide》也快完成,希望能對您有所幫助!Loading... ...

譯者:萬江(chinahai)


什么是指針?

  其實指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數據,而指針是一個指示器,它告訴程序在內存的哪塊區域可以找到數據。這是一個非常重要的概念,有很多程序和算法都是圍繞指針而設計的,如鏈表。


開始學習

  如何定義一個指針呢?就像你定義一個其它變量一樣,只不過你要在指針名字前加上一個星號。我們來看一個例子:
  下面這個程序定義了兩個指針,它們都是指向整型數據。


int* pNumberOne;
int* pNumberTwo;

  你注意到在兩個變量名前的“p”前綴了嗎?這是程序員通常在定義指針時的一個習慣,以提高便程序的閱讀性,表示這是個指針。現在讓我們來初始化這兩個指針:
pNumberOne = &some_number;
pNumberTwo = &some_other_number;
  &號讀作“什么的地址”,它表示返回的是變量在內存中的地址而不是變量本身的值。在這個例子中,pNumberOne 等于some_number的地址,所以現在pNumberOne指向some_number。 如果現在我們在程序中要用到some_number,我們就可以使用pNumberOne。


我們來學習一個例子:

  在這個例子中你將學到很多,如果你對指針的概念一點都不了解,我建議你多看幾遍這個例子,指針是個很復雜的東西,但你會很快掌握它的。
  這個例子用以增強你對上面所介紹內容的了解。它是用C編寫的(注:原英文版是用C寫的代碼,譯者重新用C++改寫寫了所有代碼,并在DEV C++ 和VC++中編譯通過!)


#include <iostream.h>

void main()
{
// 聲明變量:
int nNumber;
int *pPointer;


// 現在給它們賦值:
nNumber = 15;
pPointer = &nNumber;

//打印出變量nNumber的值:
cout<<"nNumber is equal to :"<< nNumber<<endl;

// 現在通過指針改變nNumber的值:
*pPointer = 25;

//證明nNumber已經被上面的程序改變
//重新打印出nNumber的值:
cout<<"nNumber is equal to :"<<nNumber<<endl;
}

  通讀一下這個程序,編譯并運行它,務必明白它是怎樣工作的。如果你完成了,準備好,開始下一小節。


陷井!

  試一下,你能找出下面這段程序的錯誤嗎?

#include <iostream.h>

int *pPointer;

void SomeFunction();
{
int nNumber;
nNumber = 25;


//讓指針指向nNumber:
pPointer = &nNumber;
}

void main()
{
SomeFunction(); //為pPointer賦值

//為什么這里失敗了?為什么沒有得到25
cout<<"Value of *pPointer: "<<*pPointer<<endl;
}

  這段程序先調用了SomeFunction函數,創建了個叫nNumber的變量,接著讓指針pPointer指向了它。可是問題出在哪兒呢?當函數結束后,nNumber被刪掉了,因為這一個局部變量。局部變量在定義它的函數執行完后都會被系統自動刪掉。也就是說當SomeFunction 函數返回主函數main()時,這個變量已經被刪掉,但pPointer還指著變量曾經用過的但現在已不屬于這個程序的區域。如果你還不明白,你可以再讀讀這個程序,注意它的局部變量和全局變量,這些概念都非常重要。
  但這個問題怎么解決呢?答案是動態分配技術。注意這在C和C++中是不同的。由于大多數程序員都是用C++,所以我用到的是C++中常用的稱謂。


動態分配

  動態分配是指針的關鍵技術。它是用來在不必定義變量的情況下分配內存和讓指針去指向它們。盡管這么說可能會讓你迷惑,其實它真的很簡單。下面的代碼就是一個為一個整型數據分配內存的例子:
int *pNumber;
pNumber = new int;
  第一行聲明一個指針pNumber。第二行為一個整型數據分配一個內存空間,并讓pNumber指向這個新內存空間。下面是一個新例,這一次是用double雙精型:
double *pDouble;
pDouble = new double;
  這種格式是一個規則,這樣寫你是不會錯的。
  但動態分配又和前面的例子有什么不同呢?就是在函數返回或執行完畢時,你分配的這塊內存區域是不會被刪除的所以我們現在可以用動態分配重寫上面的程序:
#include <iostream.h>

int *pPointer;

void SomeFunction()
{
// 讓指針指向一個新的整型
pPointer = new int;
*pPointer = 25;
}

void main()
{
SomeFunction(); // 為pPointer賦值

cout<<"Value of *pPointer: "<<*pPointer<<endl;
}
  通讀這個程序,編譯并運行它,務必理解它是怎樣工作的。當SomeFunction 調用時,它分配了一個內存,并讓pPointer指向它。這一次,當函數返回時,新的內存區域被保留下來,所以pPointer始終指著有用的信息,這是因為了動態分配。但是你再仔細讀讀上面這個程序,雖然它得到了正確結果,可仍有一個嚴重的錯誤。


分配了內存,別忘了回收

  太復雜了,怎么會還有嚴重的錯誤!其實要改正并不難。問題是:你動態地分配了一個內存空間,可它絕不會被自動刪除。也就是說,這塊內存空間會一直存在,直到你告訴電腦你已經使用完了。可結果是,你并沒有告訴電腦你已不再需要這塊內存空間了,所以它會繼續占據著內存空間造成浪費,甚至你的程序運行完畢,其它程序運行時它還存在。當這樣的問題積累到一定程度,最終將導致系統崩潰。所以這是很重要的,在你用完它以后,請釋放它的空間,如:
delete pPointer;
  這樣就差不多了,你不得不小心。在這你終止了一個有效的指針(一個確實指向某個內存的指針)。
  下面的程序,它不會浪費任何的內存:

#include <iostream.h>

int *pPointer;

void SomeFunction()
{
// 讓指針指向一個新的整型
pPointer = new int;
*pPointer = 25;
}

void main()
{
SomeFunction(); //為pPointer賦值
cout<<"Value of *pPointer: "<<*pPointer<<endl;

delete pPointer;
} 

  只有一行與前一個程序不同,但就是這最后一行十分地重要。如果你不刪除它,你就會制造一起“內存漏洞”,而讓內存逐漸地泄漏。
  (譯者:假如在程序中調用了兩次SomeFunction,你又該如何修改這個程序呢?請讀者自己思考)

傳遞指針到函數

  傳遞指針到函數是非常有用的,也很容易掌握。如果我們寫一個程序,讓一個數加上5,看一看這個程序完整嗎?:
#include <iostream.h>

void AddFive(int Number)
{
Number = Number + 5;
}

void main()
{
int nMyNumber = 18;

cout<<"My original number is "<<nMyNumber<<endl;
AddFive(nMyNumber);
cout<<"My new number is "<<nMyNumber<<endl;
//得到了結果23嗎?問題出在哪兒?
}
  問題出在函數AddFive里用到的Number是變量nMyNumber的一個副本而傳遞給函數,而不是變量本身。因此, " Number = Number + 5" 這一行是把變量的副本加了5,而原始的變量在主函數main()里依然沒變。試著運行這個程序,自己去體會一下。
  要解決這個問題,我們就要傳遞一個指針到函數,所以我們要修改一下函數讓它能接受指針:把'void AddFive(int Number)' 改成 'void AddFive(int* Number)' 。下面就是改過的程序,注意函數調用時要用&號,以表示傳遞的是指針:
#include <iostream.h>
void AddFive(int* Number)
{
*Number = *Number + 5;
}

void main()
{
int nMyNumber = 18;

cout<<"My original number is "<<nMyNumber<<endl;
AddFive(&nMyNumber);
cout<<"My new number is "<<nMyNumber<<endl;
}


  試著自己去運行它,注意在函數AddFive的參數Number前加*號的重要性:它告訴編譯器,我們是把指針所指的變量加5。而不并指針自己加5。

  最后,如果想讓函數返回指針的話,你可以這么寫:
int * MyFunction();
  在這句里,MyFunction返回一個指向整型的指針。


指向類的指針

  指針在類中的操作要格外小心,你可以用如下的辦法定義一個類:
class MyClass
{
  public:
  int m_Number;
  char m_Character;
};
  接著你就可以定義一個MyClass 類的變量了:
MyClass thing;
  你應該已經知道怎樣去定義一個指針了吧:
MyClass *thing;
  接著你可以分配個內存空間給它:
thing = new MyClass;
  注意,問題出現了。你打算怎樣使用這個指針呢,通常你可能會寫'thing.m_Number',但是thing是類嗎,不,它是一個指向類的指針,它本身并不包含一個叫m_Number的變量。所以我們必須用另一種方法:就是把'.'(點號)換成 -> ,來看下面的例子:
class MyClass
{
public:
int m_Number;
char m_Character;
};

void main()
{
MyClass *pPointer;
pPointer = new MyClass;

pPointer->m_Number = 10;
pPointer->m_Character = 's';

delete pPointer;
}

指向數組的指針

  你也可以讓指針指向一個數組,按下面的方法操作:
int *pArray;
pArray = new int[6];
  程序會創建一個指針pArray,讓它指向一個有六個元素的數組。另外一種方法,不用動態分配:
int *pArray;
int MyArray[6];
pArray = &MyArray[0];
  注意,&MyArray[0] 也可以簡寫成 MyArray ,都表示是數組的第一個元素地址。但如果寫成pArray = &MyArray可能就會出問題,結果是 pArray 指向的是指向數組的指針(在一維數組中盡管與&MyArray[0]相等),而不是你想要的,在多維數組中很容易出錯。


在數組中使用指針

  一旦你定義了一個指向數組的指針,你該怎樣使用它呢?讓我們來看一個例子,一個指向整型數組的指針:

#include <iostream.h>

void main()
{
int Array[3];
Array[0] = 10;
Array[1] = 20;
Array[2] = 30;

int *pArray;
pArray = &Array[0];

cout<<"pArray points to the value %d\n"<<*pArray<<endl;
}

  如果讓指針指向數組元素中的下一個,可以用pArray++.也可以用你應該能想到的pArray + 1,都會讓指針指向數組的下一個元素。要注意的是你在移動指針時,程序并不檢查你是否已經移動地超出了你定義的數組,也就是說你很可能通過上面的簡單指針加操作而訪問到數組以外的數據,而結果就是,可能會使系統崩潰,所以請格外小心。
  當然有了pArray + 1,也可以有pArray - 1,這種操作在循環中很常用,特別是while循環中。
  另一個需要注意的是,如果你定義了一個指向整型數的指針:int* pNumberSet ,你可以把它當作是數組,如:pNumberSet[0] 和 *pNumberSet是相等的,pNumberSet[1]與*(pNumberSet + 1)也是相等的。
  在這一節的最后提一個警告:如果你用 new 動態地分配了一個數組,
int *pArray;
pArray = new int[6];
  別忘了回收,
delete[] pArray;
  這一句是告訴編譯器是刪除整個數組而不一個單獨的元素。千萬記住了。


后話

  還有一點要小心,別刪除一個根本就沒分配內存的指針,典型的是如果沒用new分配,就別用delete:

void main()
{
  int number;
  int *pNumber = number;

  delete pNumber; // 錯誤 - *pNumber 沒有用new動態分配內存.
}

常見問題解答

Q:為什么我在編譯程序時老是在 new 和 delete語句中出現'symbol undefined' 錯誤?
A:new 和 delete都是C++在C上的擴展,這個錯誤是說編譯器認為你現在的程序是C而不C++,當然會出錯了。看看你的文件名是不是.cpp結尾。

Q:new 和 malloc有什么不同?
A:new 是C++中的關健字,用來分配內存的一個標準函數。如果沒有必要,請不要在C++中使用malloc。因為malloc是C中的語法,它不是為面向對象的C++而設計的。

Q:我可以同時使用free 和 delete嗎?
A:你應該注意的是,它們各自所匹配的操作不同。free只用在用malloc分配的內存操作中,而delete只用在用new分配的內存操作中。


引用(寫給某些有能力的讀者)

  這一節的內容不是我的這篇文章的中心,只是供某些有能力的讀者參考。
  有些讀者經常問我關于引用和指針的問題,這里我簡要地討論一下。
  在前面指針的學習中,我們知道(&)是讀作“什么的地址”,但在下面的程序中,它是讀作“什么的引用”

int& Number = myOtherNumber;
Number = 25;
  引用有點像是一個指向myOtherNumber的指針,不同的是它是自動刪除的。所以他比指針在某些場合更有用。與上面等價的代碼是:
int* pNumber = &myOtherNumber;
*pNumber = 25;
  指針與引用另一個不同是你不能修改你已經定義好的引用,也就是說你不能改變它在聲明時所指的內容。舉個例子:
int myFirstNumber = 25;
int mySecondNumber = 20;
int &myReference = myFirstNumber;

myReference = mySecondNumber;//這一步能使myReference 改變嗎?

cout<<myFristNumber<<endl;//結果是20還是25?

  當在類中操作時,引用的值必須在構造函數中設定,例:

CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable)
{
  // constructor code here
}


總結

  這篇文章開始可能會較難掌握,所以最好是多讀幾遍。有些讀者暫時還不能理解,在這兒我再做一個簡要的總結:
  指針是一個指向內存區域的變量,定義時在變量名前加上星號(*)(如:int *number)。
  你可以得到任何一個變量的地址,只在變量名前加上&(如:pNumber = &my_number)。
  你可以用'new' 關鍵字動態分配內存。指針的類型必須與它所指的變量類型一樣(如:int *number 就不能指向 MyClass)。
  你可以傳遞一個指針到函數。必須用'delete'刪除你動態分配的內存。
  你可以用&array[0]而讓指針指向一個數組。
  你必須用delete[]而不是delete來刪除動態分配的數組。

  文章到這兒就差不多結束了,但這些并不就是指針所有的東西,像指向指針的指針等我還沒有介紹,因為這些東西對于一個初學指針的人來說還太復雜了,我不能讓讀者一開始就被太復雜的東西而嚇走了。好了,到這兒吧,試著運行我上面寫的小程序,也多自己寫寫程序,你肯定會進步不小的!
posted @ 2010-06-21 22:32 lhking 閱讀(373) | 評論 (0)編輯 收藏
  1. int *a = new a;   
  2. int *b = new b();  

 

其中a 為 隨機值,按書上說法是,a為上次位于該內存的值,b初始化為0;現測試類類型的結果

也就是說, 對于沒有提供任何構造函數的類,new 的時候加括號,會幫你創造一個默認構造函數,而且幫你初始化;

而new的時候沒有加括號,也會幫你構造一個默認構造函數,只是什么都沒做。

posted @ 2010-05-28 11:19 lhking 閱讀(126) | 評論 (0)編輯 收藏
請問個位高手小弟看c++教程有一點沒明白
new一個對象必須delete刪除,不是new的對象就不需要刪除了嗎?

代碼:
Person p("john green"); 
cout < < p.getName();    //string name的屬性值還存在,此時還占著內存

delete &p;        //只有

cout < < p.getName();  //這樣才提示不存在,如果delete &p注釋掉,p對象的name屬性始終是占著內存的


但是我看很多教程上的代碼不是new的對象他們并沒有delete,
難道不是new的對象就不用delete,但是他自己并不回收內存阿()????????


解析:
1、p只是一個棧變量,不是堆變量,會自動析構的,不能使用delete

2、你這個問題讓我感覺無可奈何。

感覺缺少基本的理解。


生存在棧上的對象和生存在堆上的對象你要搞清楚。

堆需要手動回收。

棧則由系統自動回收!
3、不是new的,在退出作用域后會自動析構。其占用的內存也會被自動回收掉。
這種自動變量才是最方便的,也不會造成內存泄露,因此,能用的時候盡量用,不要在自動變量完全可以解決問題的時候卻硬是要采用堆上動態申請的對象。
posted @ 2010-05-28 11:06 lhking 閱讀(864) | 評論 (0)編輯 收藏

這個問題在許多C++程序員看來會很搞笑,“這么簡單的問題還用得著你廢話!”。但是由于本人生性愚鈍,學C++的時候,確實花了很久的時間都搞不明白,只是會寫一個文件,但不會寫一個工程。而用C++編寫比較大型的項目時,文件的分割管理確實確實是非常必要的 。下面就非常簡潔明了地談談頭文件(.h)和源文件(.cpp)應該怎么寫。

   頭文件(.h):
    寫類的聲明(包括類里面的成員和方法的聲明)、函數原型、#define常數等,但一般來說不寫出具體的實現。

    在寫頭文件時需要注意,在開頭和結尾處必須按照如下樣式加上預編譯語句(如下):

#ifndef CIRCLE_H
#define CIRCLE_H

//你的代碼寫在這里

#endif
    這樣做是為了防止重復編譯,不這樣做就有可能出錯。

    至于CIRCLE_H這個名字實際上是無所謂的,你叫什么都行,只要符合規范都行。原則上來說,非常建議把它寫成這種形式,因為比較容易和頭文件的名字對應。

   源文件(.cpp):

    源文件主要寫實現頭文件中已經聲明的那些函數的具體代碼。需要注意的是,開頭必須#include一下實現的頭文件,以及要用到的頭文件。那么當你需要用到自己寫的頭文件中的類時,只需要#include進來就行了。

    下面舉個最簡單的例子來描述一下,咱就求個圓面積。

     第1步,建立一個空工程(以在VS2003環境下為例)。

     第2步,在頭文件的文件夾里新建一個名為Circle.h的頭文件,它的內容如下:

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle
...{
private:
    double r;//半徑
public:
    Circle();//構造函數
    Circle(double R);//構造函數
    double Area();//求面積函數
};

#endif
   注意到開頭結尾的預編譯語句。在頭文件里,并不寫出函數的具體實現。

    第3步,要給出Circle類的具體實現,因此,在源文件夾里新建一個Circle.cpp的文件,它的內容如下:

#include "Circle.h"

Circle::Circle()
...{
    this->r=5.0;
}

Circle::Circle(double R)
...{
    this->r=R;
}

double Circle:: Area()
...{
    return 3.14*r*r;
}
    需要注意的是:開頭處包含了Circle.h,事實上,只要此cpp文件用到的文件,都要包含進來!這個文件的名字其實不一定要叫Circle.cpp,但非常建議cpp文件與頭文件相對應。

    最后,我們建一個main.cpp來測試我們寫的Circle類,它的內容如下:

#include <iostream>
#include "Circle.h"
using namespace std;

int main()
...{
    Circle c(3);
    cout<<"Area="<<c.Area()<<endl;
    return 1;
}
    注意到開頭時有#include "Circle.h"的聲明,證明我們使用到了我們剛才寫的Circle類。

   至此,我們工程的結構為:

 

    運行一下,輸出結果為:

 

   說明我們寫的Circle類確實可以用了。

posted @ 2010-05-28 10:34 lhking 閱讀(25034) | 評論 (1)編輯 收藏

作用域運算符::是用來標識某個成員函數是屬于哪個類的。

在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的文件I/O,stream這個類有兩個重要的運算符:

1、插入器(<<)
  向流輸出數據。比如說系統有一個默認的標準輸出流(cout),一般情況下就是指的顯示器,所以,cout<<"Write Stdout"<<' ';就表示把字符串"Write Stdout"和換行字符(' ')輸出到標準輸出流。

2、析取器(>>)
  從流中輸入數據。比如說系統有一個默認的標準輸入流(cin),一般情況下就是指的鍵盤,所以,cin>>x;就表示從標準輸入流中讀取一個指定類型(即變量x的類型)的數據。

  在C++中,對文件的操作是通過stream的子類fstream(file stream)來實現的,所以,要用這種方式操作文件,就必須加入頭文件fstream.h。


A.cpp要引用B.cpp的函數。
最干凈的方法是,為B.cpp建立一個頭文件B.h,將A.cpp要調用的函數聲明寫進去。
然后在A.cpp里#include這個B.h。

很C的方法是。在A.cpp里面直接extern 那個B.cpp里的函數,就是在extern后面寫上函數聲明。然后B.cpp里的那個函數要是static的。


附加說明
使用命名空間
2008要求較嚴格 .h是C語言里的東西,所以包含頭文件時應該用
#include <iostream>
using namespace std;


c++中的STL和MFC
c++是一門編程語言,這門語言有它自己的標準和規范(比如有自己的語法)。
同樣,針對C++這門語言,標準化組織又規定了相關的“程序庫”,程序庫中有各式各樣的工具(都是由高手編寫的,所以可用性極佳)供編程人員使用,而STL(standard   template   library,標準模板庫)就是C++“程序庫”的一部分。
至于MFC,它只不過是“利用C++的語法對windows   API進行的面向對象的封裝”而已,也就是說,有了mfc,我們不用“直接”調用windows   API,而是可以通過C++的語法、以面向對象的方式使用windows   API。

C++   是一種編程語言,可以支持成面向過程,或者基于過程,或者面向對象設計方法
STL   是C++標準程序庫,提供處了基本的數據類型int   char,還有擴展的用類實現的容器類型如vector,list等標準泛型容器類型,以及一些通用的泛型算法
MFC,一個framework,   用面向對象的方法,來封裝win32   api來進行windows   平臺上的程序開發

這是因為在函數結束之后要釋放臨時變量。對指針賦值,一定要采用“指針的指針”。 
我改過的程序如下: 

void   init(int   **base,int   **top) 

int   *temp   =   NULL; 
temp   
=   (int*)   malloc(sizeof(int)*50); 
*base   =   temp; 
*top     =   temp; 
}
 

void   main() 

int   *base   =   NULL,   *top   =   NULL; 
init(
&base,   &top); 
printf( 
"%X\t%X\n ",   base,   top); 
}
 
最后不要忘了調用free()去釋放你分配的內存。

vs2008下cannot convert parameter 1 from 'LPCTSTR' to 'const char *'的解決方法:
1. 使用_T()實現ASCII與UNICODE自動轉換
2. 在使用字符串的使用 T"Hello world"或者L"hello world"
3. 設置Character Set為Use Multi-Byte Character Set
posted @ 2010-05-28 09:46 lhking 閱讀(282) | 評論 (0)編輯 收藏

 

#include <iostream>
#include 
<fstream>
#include 
<string>

using namespace std;

int main()
{
    
const char filename[] = "mytext.txt";
    ofstream o_file;
    ifstream i_file;
    
string out_text;

    
//
    o_file.open(filename);
    
for (int i = 1; i <= 10; i++)
    
{
        o_file 
<< "" << i << ""<<endl; //將內容寫入到文本文件中
    }

    o_file.close();

    
//
    i_file.open(filename);
    
if (i_file.is_open())
    
{
        
while (i_file.good())
        
{
            i_file
>> out_text; //將讀取的內容存儲到變量out_text中
            cout << out_text << endl; //在控制臺輸出讀取的內容。為什么最后一行的內容會出現兩次
        }

    }

    
else
        cout 
<< "打開文件:" << filename << " 時出錯!";
    i_file.close();

    system(
"PAUSE");
    
return 0;
}



preheader:
#include "stdafx.h"
#include 
<iostream>
#include 
<fstream>
#include 
<string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    
const char filename[]="test.doc";
    ofstream o_file;
/* 輸出流:將數據從內存輸出其中ofstream是將數據輸出到文件,因此對于文件來說是“寫”*/
    ifstream i_file;
/*將數據輸入到內存,其中ifstream是說輸入的數據在文件中,因此對于文件來說是“讀”*/
    
string out_text;

    
//
    o_file.open(filename);
    
for(int i =0;i<=12;i++)
    
{
        o_file
<<""<<i<<"行\n";//將內容寫入文本
    }

    o_file.close();
    
//
    i_file.open(filename);
    
if(i_file.is_open())
    
{
        
while(i_file>>out_text)
        
{
            cout 
<< out_text << endl;
        }

    }

    
else
        cout
<<"打開文件:"<<filename<<"時出錯!";
    i_file.close();
    system(
"PAUSE");

    
return 0;
}
 
posted @ 2010-05-28 09:46 lhking 閱讀(260) | 評論 (0)編輯 收藏
今天注冊c++博客了
posted @ 2010-05-28 08:42 lhking 閱讀(369) | 評論 (0)編輯 收藏
僅列出標題
共3頁: 1 2 3 

導航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美午夜剧场| 91久久国产综合久久91精品网站| 亚洲二区视频在线| 亚洲一级电影| 蜜桃久久精品一区二区| 亚洲黄色成人网| 欧美丝袜一区二区三区| 亚洲欧美国产一区二区三区| 免费毛片一区二区三区久久久| 久久久久久久综合狠狠综合| 国产精品自在欧美一区| 久久欧美中文字幕| 在线亚洲国产精品网站| 久久综合九色综合网站| 亚洲在线免费观看| 亚洲精品看片| 在线播放亚洲| 国产精品一区视频| 黄色精品在线看| 国产欧美日韩激情| 欧美日韩国产成人精品| 久久久欧美一区二区| 99精品久久免费看蜜臀剧情介绍| 久久综合免费视频影院| 亚洲一区高清| 久久天天综合| 91久久在线| 午夜精品一区二区三区在线| 99国产精品视频免费观看| 一区二区三区四区在线| 欧美主播一区二区三区美女 久久精品人 | 久久国产精品久久久久久| 小嫩嫩精品导航| 亚洲精品1区2区| 国产精品视频久久一区| 欧美理论在线| 欧美精品一区二区三区一线天视频| 欧美日韩一区二区三区在线观看免 | 欧美视频一区| 亚洲高清资源| 久久国产精品一区二区三区四区| 西瓜成人精品人成网站| 最新国产の精品合集bt伙计| 久久精品亚洲精品国产欧美kt∨| 久久国产视频网| 国产精品成人一区二区艾草| 国产精自产拍久久久久久蜜| 亚洲免费电影在线| 日韩午夜电影av| 亚洲欧美日韩国产综合在线| 欧美在线短视频| 另类图片国产| 欧美在线免费观看视频| 国产伦精品一区二区三区在线观看| 日韩手机在线导航| 亚洲国产女人aaa毛片在线| 亚洲最新在线视频| 欧美成人69av| 国产精品久久久久久久久久免费看 | 欧美视频手机在线| 一本一本久久a久久精品牛牛影视| 亚洲视频中文字幕| 久久aⅴ国产欧美74aaa| 欧美国产高潮xxxx1819| 亚洲人成精品久久久久| 在线视频亚洲| 国产精品久久久久久久久久免费 | 久久一综合视频| 伊人狠狠色丁香综合尤物| 麻豆国产精品777777在线| 久久婷婷国产综合尤物精品| 亚洲国产精品123| 亚洲国产女人aaa毛片在线| 欧美黄污视频| 国内精品久久久久影院色| 日韩视频一区| 一本到高清视频免费精品| 亚洲精品中文字幕在线| 日韩写真在线| 日韩视频在线观看免费| 午夜久久久久久久久久一区二区| 国产精品任我爽爆在线播放| 久久精品动漫| 媚黑女一区二区| 国产精品一区二区在线观看网站 | 蜜臀久久99精品久久久画质超高清 | 亚洲一区二区三区免费观看| 老司机aⅴ在线精品导航| 久久人人97超碰人人澡爱香蕉| 在线观看欧美视频| 亚洲美女福利视频网站| 免播放器亚洲一区| 一区二区福利| 亚洲黄一区二区| 欧美日韩中文字幕综合视频| 欧美一区二区三区免费观看| 久久久久久久成人| 亚洲天天影视| 看欧美日韩国产| 国内揄拍国内精品久久| 亚洲国产精品一区二区www| 欧美午夜宅男影院| 欧美成人小视频| 国产伦精品一区二区三区| 亚洲国产精品久久人人爱蜜臀| 国产日韩欧美在线| 久久激情五月婷婷| 欧美国产欧美亚洲国产日韩mv天天看完整 | 牛夜精品久久久久久久99黑人| 国内一区二区三区| 日韩写真在线| 亚洲承认在线| 亚洲高清视频在线| 欧美国产日韩a欧美在线观看| 欧美一区二区三区的| 欧美日韩国产片| 女人香蕉久久**毛片精品| 美女被久久久| 久久香蕉国产线看观看网| 国产精品免费观看视频| 99国产精品视频免费观看| 亚洲国产老妈| 久久久亚洲成人| 久久久欧美一区二区| 国产精品久久久久久一区二区三区| 亚洲国产精品一区二区www在线 | 国产精品99久久久久久久vr| 国产欧美日韩伦理| 亚洲精品一区二区三区福利| 亚洲另类一区二区| 激情综合色丁香一区二区| 蜜臀91精品一区二区三区| 国产精品日韩欧美一区二区| 亚洲精品欧美极品| 亚洲精品国产精品乱码不99 | 久久国产精品一区二区| 欧美一区二区私人影院日本 | 欧美电影在线观看| 欧美成人dvd在线视频| 激情综合网激情| 久久在线免费视频| 亚洲第一偷拍| 中文国产成人精品| 国产精品电影在线观看| 亚洲在线成人精品| 亚洲第一色中文字幕| 久久艳片www.17c.com| 久久一区中文字幕| 1024国产精品| 欧美福利小视频| 91久久夜色精品国产九色| 99精品久久| 国产精品国产三级国产专区53| 亚洲欧美国产精品va在线观看| 久久久久久国产精品mv| 1024成人| 国产精品xxx在线观看www| 午夜精品一区二区三区在线| 久久精品综合一区| 亚洲国产天堂网精品网站| 欧美区一区二| 性久久久久久久久久久久| 免费一级欧美片在线播放| 亚洲毛片一区| 欧美午夜精品理论片a级大开眼界| 亚洲欧美在线磁力| 亚洲视频在线看| 国产精品日韩欧美| 免费成人高清在线视频| 亚洲视频精选| 欧美成人精品在线播放| 亚洲网站在线观看| 在线观看视频日韩| 国产精品久久久久婷婷| 美女成人午夜| 欧美一级二级三级蜜桃| 欧美一级理论性理论a| 亚洲高清成人| 国产精品视频免费| 欧美freesex交免费视频| 亚洲一区在线播放| 91久久极品少妇xxxxⅹ软件| 欧美在线视频播放| 一本久久精品一区二区| 一区二区在线观看视频在线观看| 欧美日韩一区二区三区| 老牛影视一区二区三区| 午夜精品久久久久| 日韩天堂av| 亚洲国产裸拍裸体视频在线观看乱了中文 | 极品尤物一区二区三区| 欧美日韩视频在线一区二区观看视频| 欧美亚洲视频一区二区| 亚洲日本一区二区| 欧美成人精品h版在线观看| 久久精品国产一区二区三| 亚洲网站视频| 日韩视频一区二区三区在线播放 | 欧美日韩在线一区| 欧美国产日韩一区|