C++中關(guān)于指針入門的的文章

字號:

什么是指針?
    其實指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數(shù)據(jù),而指針是一個指示器,它告訴程序在內(nèi)存的哪塊區(qū)域可以找到數(shù)據(jù)。這是一個非常重要的概念,有很多程序和算法都是圍繞指針而設計的,如鏈表。
    開始學習
    如何定義一個指針呢?就像你定義一個其它變量一樣,只不過你要在指針名字前加上一個星號。我們來看一個例子:下面這個程序定義了兩個指針,它們都是指向整型數(shù)據(jù)。
    int* pNumberOne;
    int* pNumberTwo;
    你注意到在兩個變量名前的“p”前綴了嗎?這是程序員通常在定義指針時的
    一個習慣,以提高便程序的閱讀性,表示這是個指針。現(xiàn)在讓我們來初始化這兩個指針:
    pNumberOne = &some_number;
    pNumberTwo = &some_other_number;
    &號讀作“什么的地址”,它表示返回的是變量在內(nèi)存中的地址而不是變量本身的值。在這個例子中,pNumberOne 等于some_number的地址,所以現(xiàn)在pNumberOne指向some_number。 如果現(xiàn)在我們在程序中要用到some_number,我們就可以使用pNumberOne。
    我們來學習一個例子:
    在這個例子中你將學到很多,如果你對指針的概念一點都不了解,我建議你多看幾遍這個例子,指針是個很復雜的東西,但你會很快掌握它的。
    這個例子用以增強你對上面所介紹內(nèi)容的了解。它是用C編寫的(注:原英文版是用C寫的代碼,譯者重新用C++改寫寫了所有代碼,并在DEV C++ 和VC++中編譯通過?。?BR>    #include
    void main()
    {
    // 聲明變量:
    int nNumber;
    int *pPointer;
    // 現(xiàn)在給它們賦值:
    nNumber = 15;
    pPointer = &nNumber;
    //打印出變量nNumber的值:
    cout
    int *pPointer;
    void SomeFunction();
    {
    int nNumber;
    nNumber = 25;
    //讓指針指向nNumber:
    pPointer = &nNumber;
    }
    void main()
    {
    SomeFunction(); //為pPointer賦值
    //為什么這里失敗了?為什么沒有得到25
    cout
    int *pPointer;
    void SomeFunction()
    {
    // 讓指針指向一個新的整型
    pPointer = new int;
    *pPointer = 25;
    }
    void main()
    {
    SomeFunction(); // 為pPointer賦值
    cout
    調(diào)用時,它分配了一個內(nèi)存,并讓pPointer指向它。這一次,當函數(shù)返回時,新的內(nèi)存區(qū)域被保留下來,所以pPointer始終指著有用的信息,這是因為了動態(tài)分配。但是你再仔細讀讀上面這個程序,雖然它得到了正確結(jié)果,可仍有一個嚴重的錯誤。
    分配了內(nèi)存,別忘了回收
    太復雜了,怎么會還有嚴重的錯誤!其實要改正并不難。問題是:你動態(tài)地分配了一個內(nèi)存空間,可它絕不會被自動刪除。也就是說,這塊內(nèi)存空間會一直存在,直到你告訴電腦你已經(jīng)使用完了??山Y(jié)果是,你并沒有告訴電腦你已不再需要這塊內(nèi)存空間了,所以它會繼續(xù)占據(jù)著內(nèi)存空間造成浪費,甚至你的程序運行完畢,其它程序運行時它還存在。當這樣的問題積累到一定程度,最終將導致系統(tǒng)崩潰。所以這是很重要的,在你用完它以后,請釋放它的空間,如:delete pPointer;
    這樣就差不多了,你不得不小心。在這你終止了一個有效的指針(一個確實指向某個內(nèi)存的指針)。